c++ - 为什么我不能在派生类重写函数中调用 protected 虚拟基类函数?

标签 c++ inheritance polymorphism

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;
    }
};

(我声明它是公开的,以便在我的测试中直接调用它)

关于c++ - 为什么我不能在派生类重写函数中调用 protected 虚拟基类函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760228/

相关文章:

c++ - 如何相互连接或链接两个 C++ 程序?

javascript - 如何从核心 OpenERP 6.1 继承 javascript

c++ - 在派生类中创建具有相同名称但不同返回类型的新函数

node.js - Node.js 中多态数组的序列化

c++ - 多态性和指针数组 (C++)

c++ - g++:用闭包类型初始化的 std::function 总是使用堆分配?

c++ - 在进程和 DLL 之间共享全局/静态变量

c++ - 为现有缓冲区提供 std::istream 接口(interface)而不复制它

c++ - b2Body 的派生类或包含 b2Body 对象的类?

c++ - 无需动态转换即可复制派生类属性的方法