前提・実現したいこと
動的に確保したインスタンスのテーブルだと派生クラスの関数が呼び出せるのですが、
テーブルを静的にした途端、親クラスの関数が呼び出されるようになりました。
なんとなくこうなる気はしていたのですが...
時間コストかけてポリモーフィズムについて理解を深めていけば解決できるとは思っているのですが、
「数行の修正で解決する可能性」を捨てる前に、
ここでアドバイスをもらってみることにしました。
該当のソースコード
class base { private: int number; public: base( int number ) : number( number ) { } virtual void display() { printf( "base %d.\n", number ); } }; class derived : public base { private: int number; public: derived( int number ) : base( number ), number( number ) { } void display() { printf( "derived %d.\n", number ); } }; static base Table[] = { base( 0 ), base( 1 ), derived( 2 ), derived( 3 ), }; #define TABLE_SIZE sizeof( Table ) / sizeof( Table[0] ) void Display() { for ( int arrayIndex = 0; arrayIndex < TABLE_SIZE; arrayIndex++ ) { base* pBase = &Table[arrayIndex]; pBase->display(); } }
このコードだと
base 0
base 1
base 2
base 3
と表示されるため親クラスの関数が呼ばれたと判断しました。
試したこと
元々動的に確保していたので、
static base* pTable[] = { new base( 0 ), new base( 1 ), new derived( 2 ), new derived( 3 ), };
としていたときは、
base 0
base 1
derived 2
derived 3
と表示されていました。
解決したいこと
Display関数内で、派生クラスの display 関数を呼び出す方法はないでしょうか?
アドバイス頂けると助かります。
宜しくお願い申し上げます。
追記
「動的な方のソースではコンパイルが通らないのでは?」とのご指摘がありました。
私の質問内容が中途半端でしたのでこのようなご指摘になったのかと思いますので、
元々の動的な方のコードも記します。
class base { private: int number; public: base( int number ) : number( number ) { } virtual void display() { printf( "base %d.\n", number ); } }; class derived : public base { private: int number; public: derived( int number ) : base( number ), number( number ) { } void display() { printf( "derived %d.\n", number ); } }; static base* pTable[] = { new base( 0 ), new base( 1 ), new derived( 2 ), new derived( 3 ), }; #define TABLE_SIZE sizeof( pTable ) / sizeof( pTable[0] ) void Display() { for ( int arrayIndex = 0; arrayIndex < TABLE_SIZE; arrayIndex++ ) { base* pBase = pTable[arrayIndex]; pBase->display(); } }
中途半端な書き方で失礼しました...
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/08 11:50
2018/04/08 11:57
2018/04/08 11:59
2018/04/08 12:47
2018/04/08 13:23