2009-01-11 118 views
5
#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主(INT,字符**)': protected.cpp:26:错误:基地'是'派生的'难以接近的基地受保护的派生类

为什么不可能创建基地指针的派生对象?


所以我可以创建派生类的instanse像

Derived d 
Derived d1= new Derived; 

但是从基类指针创建例如像

Base * b = new derived 

将失败。

这是因为Derived不是从派生类派生的派生类派生类和派生类?

这是正确的吗?

+0

为什么这个问题得到3个downvotes?这是一个完全合法的问题。 +1,可笑。 – mstrobl 2009-01-11 23:53:09

回答

6

Why its not possible to create Derived object with base pointer????

因为基数是private。这明确禁止将您的课程作为外部的Base实例处理。从外部看,你的班级Derived而不是Base的子类,只能从班级本身的内部。

对于protected继承的计数相同,唯一的区别是基类现在对于自己的类不再是私有的,而是对任何派生类也是私有的。尽管如此,它的行为就像私人继承一样。

0

So I can create an instanse of Derived class like

Derived d Derived d1= new Derived; But creating instance from Base class pointer like

Base * b = new derived will fail.

This is because Derived is not actaully a derived class from Base when derived procted and privately??

Is this correct?????

这完全像康拉德解释。

它实际上仍然来自基地。为了验证这一点,如果你不覆盖Derived中的虚拟方法,那么Base版本将被调用。

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

相关问题