加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 是否可以覆盖(隐藏)非虚方法,但仍然可以从子类中显式调用它

发布时间:2020-12-16 09:57:24 所属栏目:百科 来源:网络整理
导读:是否可以覆盖(隐藏)非虚方法,但仍然可以从子类中显式调用它? It works但我不知道它是特定于编译器还是应该因某种原因而避免. (我没想到它会根据“隐藏”功能的术语而起作用.) class A{public: void foo() { cout "A::foo()" endl; }};class B : public A{pu
是否可以覆盖(隐藏)非虚方法,但仍然可以从子类中显式调用它? It works但我不知道它是特定于编译器还是应该因某种原因而避免. (我没想到它会根据“隐藏”功能的术语而起作用.)

class A
{
public:
    void foo()
    {
        cout << "A::foo()" << endl;
    }
};

class B : public A
{
public:
    void foo()
    {
        cout << "B::foo()" << endl;
        A::foo();
    }
};

int main()
{
    B b;
    b.foo();
}

编辑

这可能会更多地关注这个问题.

父的非虚方法在我们无法改变的基础设施库中,但是我们需要派生一个隐藏(不是“覆盖”,如我现在所知)的一个类,一个支持增强它的功能(和在途中明确地调用父元素.也就是说,派生类需要使用这个“扩充”函数来代替父类.这是隐藏父函数的有效方案吗?

解决方法

没关系,但你没有压倒一切.正如你已经提到的那样,你正在躲藏.覆盖意味着多态性将对您的对象起作用,在您的情况下,它不会.

例如:

A* a = new B;
a->foo();

将调用方法A :: foo(),而如果您要覆盖该方法(通过使其成为虚拟),它将调用B :: foo().

另请注意,可能存在与实际签名相关的问题,例如,如果您使用方法B :: foo(int),则无法直接在B对象上调用foo(void).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读