覆盖父类的功能

时间:2012-09-20 19:09:48

标签: c++ class function override

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

1 个答案:

答案 0 :(得分:8)

这是因为对象切片,你需要保留一个指针向量(最好是智能指针)。

我假设stuff被定义为std::vector<classa> stuff;。当你这样做

stuff.push_back(b);

推入向量的对象是b的一片 - 特别是classa部分。所有其他类型信息都将丢失。为了使其按预期工作,您需要:

std::vector<classa*> stuff;

或类似的。现在代码的方式,你无法让它工作,因为stuff[1]不再是classb,而是classa