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

2

成员函数虚拟性仅在您从指向实际对象的指针调用它们时才起作用,而不是从对象本身调用它们,因为在您的示例中,对象自动静态向上转换为 A 类。将您的代码更改为:

std::vector<std::unique_ptr<A>> stuff = {
    std::unique_ptr<A>(new A()), 
    std::unique_ptr<A>(new B()), 
    std::unique_ptr<A>(new C()),
};
stuff[0]->call(); 
stuff[1]->call(); 
stuff[2]->call();
于 2013-06-25T14:09:09.463 回答
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 回答