3 c++ overriding class function
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;
}
Run Code Online (Sandbox Code Playgroud)
我期望上面的代码返回
foo from a
foo from b
Run Code Online (Sandbox Code Playgroud)
但它同时返回foo from a.
我认为这是因为矢量存储classa但我不确定.我该如何classb:foo()被召唤b?
这是因为对象切片,你需要保留一个指针向量(最好是智能指针).
我假设stuff被定义为std::vector<classa> stuff;.当你这样做
stuff.push_back(b);
Run Code Online (Sandbox Code Playgroud)
被推入向量的对象是一片b- 特别是classa部分.所有其他类型信息都将丢失.为了使其按预期工作,您需要:
std::vector<classa*> stuff;
Run Code Online (Sandbox Code Playgroud)
或类似的.你的代码现在的方式,你不能让它工作,因为stuff[1]它不再是一个classb,而是一个classa.