2009-01-11 127 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超類在外部不可見。

相關問題