2016-12-23 15 views
0
#include <iostream> 

using namespace std; 

struct A 
{ 
    virtual int func(void) { return 0; } 
}; 

struct B : A 
{ 
    int func(void) { return 1; } 
}; 

int main() 
{ 
    A b = B(); 
    cout << b.func() << endl; 
} 

は、私はあなたのほとんどがその0を知っているように、出力が1ことが、し期待していました。C++:仮想関数の呼び出し親

実際のコードで達成したいものは、これらの行に沿ったものです。

struct A 
{ 
    virtual int operator() (int i); 
}; 
struct B : A 
{ 
    int operator() (int i) { return i*2; } 
}; 
struct C : A 
{ 
    int operator() (int i) { return i*3; } 
}; 
struct x 
{ 
    A test; 
}; 

だから私のコンテナは、ABまたはCを保持する場合は、手の前に伝えることができなくなりますが、それでも異なる動作をする必要があります。

私はそれが動作すると予想して機能を達成する方法はありますか?

答えて

4

A b = B();:あなたは(それがエラーなしでコンパイル理由を説明している)、タイプAのオブジェクトを構築するBオブジェクトから(コピーの省略による)代入演算子/コピーコンストラクタを使用しますが、Aを参照すると見られている

これは多型ではありません。 bはまだタイプAです。 Bへのリンクが失われました。それを行うだろう

A *b = new B(); 

cout << b->func() << endl; 

は予想通り多型/仮想関数および利回り1をトリガします。

+0

ありがとう、しかしポインタなしでこれを達成する方法はありませんか?親オブジェクトと子オブジェクトはすべて、関数を含む単なるクラスであり、可変メンバは存在しません。 – user2255757

+0

ポインタや参照がない方法はありません。 – user6556709

2

C++仮想関数は、参照/ポインタ(迂回を意味する)に対してのみ機能します。

A b = B(); 

これは、タイプBではなく、タイプAのオブジェクトを作成します。間接指定はないため、Aの関数だけが呼び出されます。

関連する問題