2017-07-14 6 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*の変数に割り当てることすらできません。あなたのコンパイラがコードを処理し、バイナリが "BOX"の代わりに "SHAPE"を印刷すると、あなたのコンパイラは本当に壊れてしまいます。

+0

Oaky。私は今それを理解する。説明のためにありがとうalot @ Murphy。はい、意味があります。 – Bob11

関連する問題