C++继承 - 为什么调用父方法?

C++ inheritance - why is parent method called?

本文关键字:方法 调用 为什么 继承 C++      更新时间:2023-10-16

我正在实现一个类层次结构,并看到对父方法的调用,我不明白为什么。使用 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;
} 
}

现在在其他地方我有一个包含 B 或 C 的向量

std::vector<A> container;
container.push_back(B());
container.push_back(C());
for(auto item: container){
item.update();
}

指纹

Calling A update
Calling A update

为什么?

为什么要调用父方法?

因为向量包含父对象。

它包含 B 和 C,子对象。

它不包含这些对象。它是A对象的向量,因此它只包含A类型的对象,而不包含任何其他类型的对象。您从派生对象复制了基类子对象(此操作称为切片(。副本不是基类子对象,而是单独的A对象。

此外,派生类不会重写父类函数。只能覆盖虚拟函数。虚拟调度只能通过指针或对基类子对象的引用进行间接操作并调用虚拟函数来使用。

附言也不能从类外部调用私有成员函数。示例程序格式不正确。

向量存储A的实例,而不是BC,尽管它们是子代。 将BC添加到容器时,它会向下转换为A,并且您将丢失与BC关联的信息。 因此,当您对项目调用update()方法时,它会为每个项目调用A::update