为什么我不能在派生类重写函数中调用受保护的虚拟基类函数?

Why can't I call protected virtual base class function in the derived class overridden function?

本文关键字:受保护 调用 虚拟 基类 类函数 函数 不能 派生 重写 为什么      更新时间:2023-10-16
class Base
{
protected:
    virtual void show()
    {
        // Do some stuff.
    }
};
class Derived : public Base
{
protected:
    virtual void show()
    {
        // Do some stuff.
    }
};
class Derived_2 : public Derived
{
protected:
    virtual void show()
    {
        this->show();    // error: Base::show() is in accessible
        show();          // error: Base::show() is in accessible
        Derived::show(); // error: Base::show() is in accessible
    }
};

在上述情况下,调用虚基类函数(在派生类中重写)会产生错误。

我能找到的唯一错误是,您从自身调用show导致无限递归并以堆栈溢出错误结束。

但是这段代码编译并运行时甚至没有警告:

class Derived_2 : public Derived
{
public:
    virtual void show()
    {
        //this->show();    // infinite recursion => stack overflow
        Base::show();    // ok calls show() from Base
        Derived::show();    // ok calls show() from Derived
        std::cout << "Derived2" << std::endl;
    }
};

(我将其声明为public以便在测试中直接调用)

如果我理解正确,你想调用Base::show(),那么你可以这样做:

Derived::Base::show();或仅Base::show();

但是如果你只是想调用超类的方法,你有一个正确的代码