【问题标题】:Protected derived class受保护的派生类
【发布时间】:2010-09-30 20:13:49
【问题描述】:
 #include <iostream>
using namespace std;

class Base
{
    public:
        Base(){cout <<"Base"<<endl;}
        virtual ~Base(){cout<<"~Base"<<endl;}
        virtual void foo(){ cout<<"foo base"<<endl;}
};

class Derived: private Base
{
    public:
        Derived(){cout<<"Derived"<<endl;}
        virtual ~Derived(){cout<<"~Derived"<<endl;}
        virtual void  foo(){ cout<<"foo dervied"<<endl;}
};


int main(int argc, char *argv[])
{
    Base *pb = new Derived;
    Derived d;
    d.foo();
    return 0;
}

当我执行上述示例程序时,我收到以下错误: protected.cpp:在函数“int main(int, char**)”中: protected.cpp:26: error: ‘Base’ is an inaccessible base of ‘Derived’

为什么不能用基指针创建派生对象????


所以我可以创建一个 Derived 类的实例,例如

Derived d
Derived d1= new Derived;

但是像这样从基类指针创建实例

Base * b = new derived 

会失败。

这是因为 Derived 实际上不是从 Base 派生的派生类,当派生 procted 和 private 时??

这样说对吗??????

【问题讨论】:

  • 为什么这个问题得到 3 票反对?这是一个完全合理的问题。 +1,荒谬。

标签: c++ inheritance


【解决方案1】:

为什么不能用基指针创建派生对象????

因为基础是private。这明确禁止从外部将您的类视为Base 实例。从外部看,您的类Derived不是Base 的子类,只是从类本身内部来看。

protected 继承同样重要,唯一的区别是基类现在不再是自己类的私有,而是任何派生类的私有。但在外部看来,它的行为就像私有继承。

【讨论】:

    【解决方案2】:

    您可能想看看 this faq 关于 c++ 和继承。特别是 24.524.6 部分。

    【讨论】:

      【解决方案3】:

      所以我可以创建一个 Derived 类的实例,例如

      派生 d 派生 d1= 新派生;但 从基类创建实例 指针像

      Base * b = 新派生将失败。

      这是因为 Derived 不是 实际上是 Base 的派生类 什么时候派生出来的??

      这样对吗??????

      这和康拉德解释的完全一样。

      它实际上仍然是从 Base 派生的。为了验证这一点,如果您不覆盖 Derived 中的虚拟方法,则会调用 Base 版本。

      但是,由于您将 Base 声明为受保护,编译器不会让您自动将 Derived* 强制转换为 Base*,因为 Base 超类在外部不可见。

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 2014-05-01
        • 2016-03-11
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多