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

Is it okay to override (hide) a non-virtual method but still call it explicitly from a child class?

本文关键字:子类 调用 方法 覆盖 隐藏 虚拟 是否      更新时间:2023-10-16

是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它?它有效,但我不知道它是编译器特定的,还是出于某种原因应该避免。(我没想到它会基于"隐藏"功能的术语工作。)

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(),而如果要覆盖该方法(通过使其为virtual),它将调用B::foo()

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