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

时间:2015-06-10 15:03:58

标签: 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
    }
};

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

2 个答案:

答案 0 :(得分:1)

我能找到的唯一错误就是你从itsel调用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;
    }
};

(我在公开测试中直接称它为公开声明)

答案 1 :(得分:0)

如果我理解你是正确的,并且你想打电话给Base::show(),那么你可以通过以下方式做到:

Derived::Base::show();Base::show();

但是如果你只想调用超类的方法,你就会得到正确的代码。

相关问题