【发布时间】:2020-01-23 18:00:41
【问题描述】:
我正在实现一个类层次结构并看到对父方法的调用,但我不明白这是为什么。使用 C++11 结构,这是我第一个使用一些特性的 11 个项目,因此我相信这可能是一个良性问题。
class A{
void update(){
std::err << "Calling A update " << std::endl;
}
}
class B: public A{
void update(){
std::cout << "In B update! " << std::endl;
}
}
class C: public A{
void update(){
std::cout << "In C update! " << std::endl;
}
}
现在在其他地方我有一个包含 Bs 或 Cs 的向量
std::vector<A> container;
container.push_back(B());
container.push_back(C());
for(auto item: container){
item.update();
}
打印
Calling A update
Calling A update
为什么?
【问题讨论】:
-
阅读object slicing。此外,由于
update不是虚拟的,如果container是经过适当其他更改的vector<A*>,A 的update仍将被调用。 -
关注问题:为什么
container.push_back(B());合法?似乎这样的代码永远不可取,尤其是链接答案中描述的 Frankenobjects。虽然紧急行为是现有规则的一个可以理解的后果,但添加一条新规则来禁止(或至少发出相对较低级别的警告)这种不良行为似乎是一个可靠的计划……尽管可能会破坏现有代码(即已经以不同的方式破坏了,但仍然如此)。呃。 -
@MarkStorer 几乎从来没有需要复制基类子对象。这是一个有用的功能。您可以将类抽象化以使其非法。
标签: c++ c++11 inheritance