3
class classa {
public:
    virtual void foo();
};

class classb : public classa {
public:
     virtual void foo() override;
};


void classa::foo()
{
    std::cout << "foo from a" << std::endl;
}

void classb::foo()
{
    std::cout << "foo from b" << std::endl;
}

int main()
{
    std::vector<classa> stuff; 

    classa a;
    classb b;

    stuff.push_back(a);
    stuff.push_back(b);

    stuff[0].foo();
    stuff[1].foo();


    return 0;
}

上記のコードが返されることを期待していました

foo from a 
foo from b

しかし、両方を として返しますfoo from a

これはベクトルが格納されているためだと思いますがclassa、よくわかりません。どうすればclassb:foo()から呼び出されるようになりbますか?

4

1 に答える 1

7

これはobject slicingが原因で発生します。ポインターのベクトル (できればスマート ポインター) を保持する必要があります。

stuffとして定義されていると仮定していstd::vector<classa> stuff;ます。あなたがするとき

stuff.push_back(b);

ベクトルにプッシュされたオブジェクトは、b特にclassaパーツのスライスです。他のすべての型情報は失われます。これが期待どおりに機能するには、次のものが必要です。

std::vector<classa*> stuff;

または類似。現在のコードでは、 が ではなく であるstuff[1]ため、動作させることができません。classbclassa

于 2012-09-20T19:11:41.770 に答える