2

次のコードがあります(#includes とusing namespace std省略):

class A {
    public:
        void call(){callme();}
    private:
        virtual void callme() {cout << "I'm A" << endl;}
};

class B : public A {
    private:
        virtual void callme() {cout << "I'm B" << endl;}
};

class C : public B {
    public:
        virtual void callme(){ cout << "I'm C" << endl;}
};

int main(){
    vector<A> stuff = {
        A(), B(), C(),
    };
    stuff[0].call(); // output: I'm A
    stuff[1].call(); // output: I'm A
    stuff[2].call(); // output: I'm A
    return 0;
}

コメントで述べたように、上記のプログラムの出力は次のとおりです。

I'm A
I'm A
I'm A

ただし、対応する要素が作成された型を C++ が自動的に認識するようにしてほしい。つまり、C++の出力が欲しい

I'm A
I'm B
I'm C

(つまり、コンパイラは適切なサブクラスを選択します。)

このシナリオでこれは可能ですか (つまり、すべての要素が a から出てくる場合vector)?

4

2 に答える 2

1

C++ ポリモーフィズムでは、ポインターまたは参照のいずれかを使用する必要があります。あなたはこのようにすることができます

int main(){
         vector<A*> stuff;
         stuff.push_back(new A);
         stuff.push_back(new B);
         stuff.push_back(new C);
         stuff[0]->call(); // output: I'm A
         stuff[1]->call(); // output: I'm A
         stuff[2]->call(); // output: I'm A
         while (!stuff.empty()){
                 delete stuff.back();
                 stuff.pop_back();
         }
         return 0;
 }

参考:http ://www.cplusplus.com/doc/tutorial/polymorphism/

于 2013-06-25T14:37:38.767 に答える