C++继承 - 为什么调用父方法?
C++ inheritance - why is parent method called?
我正在实现一个类层次结构,并看到对父方法的调用,我不明白为什么。使用 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
的实例,而不是B
或C
,尽管它们是子代。 将B
或C
添加到容器时,它会向下转换为A
,并且您将丢失与B
或C
关联的信息。 因此,当您对项目调用update()
方法时,它会为每个项目调用A::update
。
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- C++:使用方法调用析构函数的顺序是什么?
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 指向类方法调用的指针
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 是否有可以处理方法调用依赖关系的设计模式?
- 如何缩短C++中的方法调用?
- 从部分专用模板方法调用模板非静态方法
- 有没有办法禁止派生类中的基类方法调用?
- 为什么这C++只在编译器上编码一个不明确的方法调用Microsoft?
- 从父方法调用子方法
- 如何将子方法调用到父方法
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 从静态方法调用静态函数指针
- 从同一类中的另一个方法调用方法时出错
- 方法调用意外地像 l 值一样起作用
- 无法从派生的一个方法调用基类方法
- 从类方法调用命名空间中名为 Same 的函数时,重载解析失败
- C 多线程JAVA JNI方法调用