2016-04-12 23 views
-1

私はAから派生した任意の数のクラスのインスタンスを含むことができる、タイプAのオブジェクトのリストを持っています。リストの各メンバで関数を呼び出しています。最も派生したクラスの関数を呼び出すことができます。ただし、基本クラスの関数が呼び出されます。最も派生したクラスが使用されている場合、どうすればそれを得ることができますか?ほとんどの派生クラスから仮想関数を呼び出す

次のコードは私の問題を示しています。コードは "In a"を出力しますが、 "In b"を出力します。

#include <iostream> 

class A { 
public: 
    virtual void func() 
    { 
     std::cout << "In A" << std::endl; 
    } 
}; 

class B : public A { 
public: 
    virtual void func() 
    { 
     std::cout << "In B" << std::endl; 
    } 
}; 

int main() 
{ 
    A a = B(); 
    a.func(); 
    return 0; 
} 

答えて

6

あなたは

A a = B(); 

を行うと、あなたがslicing the objectあります。あなたが持っているのはAオブジェクトのインスタンスだけです。

B b; 
A& a = b; 

または使用ポインタ

A* a = new B; 
+0

おかげヨアヒム、私の問題 – JHobern

+0

を解決またはスマートポインタを使用します。

は、あなたが参照を使用するか必要がある多型の作業を行うには! std :: unique_ptrとstd :: shared_ptr – Ceros

+0

@Cerosこれは一般的なポインタの変形です。また、新しいスマートポインタの使用は、単純な自動削除ポインタではなく、所有権*モデルの一部として使用することをお勧めします。 –

関連する問題