受保护的派生类

时间:2009-01-11 23:12:39

标签: c++ inheritance

 #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:错误:'Base'是'Derived'的无法访问的基础

为什么无法使用基指针????

创建Derived对象

所以我可以像

那样创建Derived类的实例
Derived d
Derived d1= new Derived;

但是从Base类指针创建实例,如

Base * b = new derived 

会失败。

这是因为Derived在派生和私有派生时不是来自Base的派生类吗?

这是正确的?????

3 个答案:

答案 0 :(得分:6)

  

为什么无法使用基指针????

创建Derived对象

因为基数为private。这明确禁止从外部将您的类视为Base实例。从外部看,您的班级Derived Base的子类,仅来自班级内部。

protected继承的计数相同,唯一的区别是基类现在不再属于自己的类,而是属于任何派生类。但是,在外面,它的行为就像私人继承一样。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

  

所以我可以像

那样创建Derived类的实例      

派生d派生d1 =新派生;但   从Base类创建实例   像

这样的指针      

Base * b = new derived将失败。

     

这是因为Derived不是   来自Base的派生类   派生时和私人派生的?

     

这是正确的?????

就像康拉德解释的那样。

实际上它仍然来自Base。要验证这一点,如果您没有覆盖Derived中的虚拟方法,那么将调用Base版本。

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