2016-03-25 18 views
0

コードがどのように機能するかはわかりません。どのように c0 = new C(); *でも動作しますか? 'C'からポインタ 'A'オブジェクトを作るにはどうすればいいですか? ここで継承はどのように機能していますか?

class A { 
public: 
    A() { print("Constructor of A"); } 
    virtual ~A() { print("Destructor of A"); } 
}; 

class B : public A { 
public: 
    B() { print("Constructor of B"); } 
    ~B() { print("Destructor of B"); } 
}; 

class C : public B { 
public: 
    C() { print("Constructor of C"); } 
    ~C() { print("Destructor of C"); } 
}; 

int main() { 
    print("A* = C"); 
    A* c0 = new C(); 
    delete c0; 

    print("B* = C"); 
    B* c1 = new C(); 
    delete c1; 

    print("C* = C"); 
    C* c2 = new C(); 
    delete c2; 

    return 0; 
} 

私は長い時間前に私は、継承を理解と思ったが、今、私はそれを使用するために必要なとき、私はちょうどコードで失われてしまいました。

+0

'class C:public B'は" a "C"が "B"であることを意味します。さらに、「B」は「A」であるので、「C」も「A」である。 'C 'は' A'なので、 'A *'に割り当てることは驚くことではありません。 – nwp

+0

Um ...しかし、このコードでは、言語の非常に基本的な "幼稚園グレード"継承関連機能しか使用していません。 「相続」を理解することは可能ですが、これでは「迷子になる」ことはありますか? – AnT

答えて

1

Aから継承BからC継承、C間接的Aから継承しているので。したがって、CのすべてのインスタンスもAのインスタンスです。したがって、タイプC*の値は、タイプA*の値に直接変換することができます。

1

継承へようこそ! ..

を 連続継承階層は..あなたがCは絶対にA自身であるベースが含まれていることを見ることができるようになりました。..
************************************* 
A Base 
B Base + (Something) 
C Base + (Something) + (Something) 
************************************** 

は上の写真のように覚えておいてください。..真実を話すようなことは、あなたのために働きます
0

CはAから派生しているので、すべてのCオブジェクトは(isA)Aです。新しい演算子はCを作成し、C "isA" AはA *ポインタに割り当てることができます。 A *ポインタを使用する場合(ポインタ型がAであるため)を使用すると、CのオブジェクトのC *のポインタを持っている場合、あなただけのことができ、

をクラスAに定義されている関数を呼び出すことができ

A、B、またはCのいずれかの関数を呼び出します(パブリックまたは保護されていると仮定します)。

あなたは仮想関数「F」、及び各クラスで定義された非仮想関数「G」、および次の割り当てがある場合:

A *のpA =新しいAを、 A * pAC =新しいC; C * pC = new C;

次いで、

PA-> F())(:: Fを呼び出します。 pA-> g()はA :: g()を呼び出します。

pAC-> f()はA :: f()を呼び出します。 pAC-> g()はC :: g()を呼び出します。

pC-> f()はC :: f()を呼び出します。 pC-> g()はC :: g()を呼び出します。

実際の関心領域はpACの例にあることに注意してください。仮想関数を呼び出すと、実際のオブジェクトの実装が常に呼び出されます。プレーン関数を呼び出すと、ポインタ型に基づいて実装が呼び出されます。

関連する問題