2012-03-28 15 views
1
class C1 { 
    void A(); 
    void B(); 
} 

void C1::A(){ return B(); } 

class C2 : public C1 { 
    void B(); 
} 

C2 *obj = new C2; 
obj->A(); // returns B() from C1 

なぜC1からB()が呼び出されるのですか?どのようにA()をC1にのみ存在させ、B()をC2から呼び出すか?継承。親クラスの子クラス関数を呼び出す

+0

'C2'の後に' C2'の後に 'new C2'を書く必要はありません。 – Shahbaz

+0

@Shahbaz - fixed) – Eddie

答えて

7

B()C1に、virtualにする必要があります。

仮想関数は基本的にオブジェクトの初期化時に値をとる関数ポインタです。 new C1の場合、ファンクションポインタはC1::Bを指し、new C2ファンクションポインタはC2::Bを指します。

注:virtualと関連分野についての続きを読むには、と多型をオーバーライド機能を検索します。

+0

はい、これはまさに' virtual'キーワードの役割です。 – MrTJ

+0

ああ、とても単純です..)ありがとう! – Eddie

2

メンバーメソッドは、C++ではデフォルトでvirtualではありません(あなたはJavaから来ますか?)

あなたが書いた:

class C1 { 
    void A(); 
    void B(); 
} 

class C2 : public C1 { 
    void B(); 
} 

あなたはC2B()をオーバーライドしていないが、それを隠します。

オーバーライドするには、基本クラスにvirtualと宣言する必要があります(以降のクラスでは仮想クラスは不要です)。

関連する問題