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

时间:2015-04-08 15:10:13

标签: c++ virtual-functions override

是否可以覆盖(隐藏)非虚方法,但仍然可以从子类中显式调用它? 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();
}

修改

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

父母的非虚拟方法位于我们无法更改的基础架构库中,但我们需要派生一个隐藏的类(不是&#34;覆盖, &#34;正如我现在所知道的那样一个支持增强它的功能(并在途中明确地调用父代)。也就是说,派生类需要这个&#34;增强&#34;用于代替父母的功能。 这是隐藏父功能的有效方案吗?

1 个答案:

答案 0 :(得分:7)

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

例如:

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

将调用方法A::foo(),而如果您要覆盖该方法(通过将其设为virtual),则会调用B::foo()

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