0

次のコードスニペットを使用して、ポリモーフィズムを少し試しています。

#include <iostream>
#include <vector>

using namespace std;

struct Foo {
    virtual void f() {
        cout << "f from Foo" << endl;
    }
};

struct Bar : public Foo {
    void f() {
        cout << "f from Bar" << endl;
    }
};

int main() {
    Foo foo;
    Bar bar;
    vector<Foo> fooV;
    fooV.push_back(foo);
    fooV.push_back(bar);
    for(auto it = fooV.begin(); it != fooV.end(); ++it)
        it->f();
}

f()オーバーライドされるので、一方は「f from Foo」を出力し、もう一方は「ffromBar」を出力することを期待していました。ただし、プログラムの出力は

f from Foo
f from Foo

また、C ++ 11を使用しているため、 inoverrideの宣言にキーワードを追加しようとしたことにも注意してください。効果はありませんでした。f()Bar

4

4 に答える 4

4

これを試して

int main()
{
    Foo foo;
    Bar bar;
    vector<Foo*> fooV;
    fooV.push_back(&foo);
    fooV.push_back(&bar);
    for (auto it = fooV.begin(); it != fooV.end(); ++it)
        (*it)->f();
}

ポリモーフィズムの利点を得るには、派生オブジェクトへのポインターまたは参照を使用する必要があります。

于 2013-03-05T06:09:35.173 に答える
1

これ

fooV.push_back(bar);

のみFooの一部をコピーします。オブジェクトは最終的に の内部になります。新しいオブジェクトは型であるため、後で呼び出されるのも不思議ではありません。barstruct Foovectorstruct FooFoo::f()

1 つの異なる型のオブジェクトしか格納できないvectorため、この場合、オブジェクト自体ではなく、オブジェクトへのポインタを格納する必要があります。

于 2013-03-05T06:07:27.810 に答える
0

のベクトルがありFooます。そのベクトルにa を追加すると、単純にその部分がBarベクトルにコピーされます (他のデータは無視されます)。FooBar

于 2013-03-05T06:08:06.410 に答える
0
vector<Foo> fooV;

Foo のベクトルを作成しているため、Foo の関数は Bar ではなくのみ呼び出されます。

于 2013-03-05T12:30:34.447 に答える