C ++:虚方法

时间:2013-06-25 14:07:08

标签: c++ inheritance virtual-functions

我有以下代码(#include s和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

(也就是说,编译器应该为我选择合适的子类。)

这种情况是否可行(即如果所有元素都来自vector)?

2 个答案:

答案 0 :(得分:2)

成员函数virtuality仅在从指向实际对象的指针调用它们时才起作用,而不是从对象本身调用它们,因为在您的示例中,对象自动静态上传到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();

答案 1 :(得分: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/