2017-07-14 128 views
-6

我正在解決一些基本的遺傳問題。我遇到了一些我不瞭解邏輯的東西。如果我從Base類繼承派生類作爲私有類,我是否可以訪問Base類的公共成員。這裏是我的代碼,與公共,私人和受保護區別

#include <iostream> 

struct Shape 
{ 
    virtual void print() 
    { 
    std::cout << "SHAPE" << std::endl; 
    } 
    virtual ~Shape() {} 
}; 

struct Box : private Shape 
{ 
    virtual void print() 
    { 
    std::cout << "BOX" << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Shape* s = new Box; //illformed ? can't access the public members of the base. 

    s->print(); 

    delete s; 

    return 0; 
} 
+5

問問你的老師,看書 –

+0

你的C++編譯器壞了。 gcc 7.1.1正確地發佈了一個診斷,並且無法編譯代碼:'錯誤:'Shape'是'Box''的一個不可訪問的基地 –

+0

所以它的意思是,如果我繼承爲Private,形狀不可訪問框。是?類似於我們無法訪問課堂外的私人成員。 – Bob11

回答

0

不,你不應該能夠訪問被繼承的私有基類的公共成員,其他私有繼承的目的將是毫無意義的。您甚至不應該將類型Box*的指針分配給類型爲Shape*的變量。如果你的編譯器處理代碼,並且二進制打印出「SHAPE」而不是「BOX」,那麼你的編譯器確實會被破壞。

+0

奧克。我現在明白了。非常感謝@Murphy的解釋。這是有道理的,是的。 – Bob11