C++虚拟方法覆盖
C++ virtual method overriding
可能的重复项:
在构造函数中调用虚函数
主.cpp
#include <iostream>
class BaseClass {
public:
BaseClass() {
init();
}
virtual ~BaseClass() {
deinit();
}
virtual void init() {
std::cout << "BaseClass::init()n";
}
virtual void deinit() {
std::cout << "BaseClass::deinit()n";
}
};
class SubClass : public BaseClass {
public:
virtual void init() {
std::cout << "SubClass::init()n";
}
virtual void deinit() {
std::cout << "SubClass::deinit()n";
}
};
int main() {
SubClass* cls = new SubClass;
delete cls;
return 0;
}
为什么init()
和deinit()
没有正确覆盖,并且调用了基类的方法而不是子类的方法?使其工作的要求是什么?
BaseClass::init()
BaseClass::deinit()
因为您正在构造函数中调用虚拟方法。在构造基类时,派生的基类(子类)尚未构造,因此实际上它仍然存在。
通常,避免在构造函数中调用虚拟方法是一种很好的做法。
它们被覆盖得很好。
但是,您已经从基构造函数调用了它们,并且在执行基构造函数时,对象的派生部分尚不存在。
因此,这在很大程度上是一项安全功能,并且是由C++标准强制要求的。
相关文章:
- 循环依赖,在继承类的情况下使用覆盖方法
- 确保模拟的 GTest 方法覆盖虚拟方法
- 覆盖作为另一个类的好友的虚拟受保护方法
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- C ++中的方法覆盖:是编译时还是运行时多态性?
- 错误"pure virtual method called",当此方法已被覆盖时
- 覆盖方法并用shared_ptr调用它们的奇怪行为
- 仅适用于某些模板类型的覆盖方法
- 在某些代码中覆盖方法的方式是什么?
- 为什么没有调用我的覆盖方法
- Poylmorphim,构造函数-C 中使用的覆盖方法
- 覆盖方法返回类型,在C 中使用不完整的派生类
- 从基类执行覆盖方法
- 如何自动化覆盖方法
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- 为什么不调用这个 Ruby 覆盖方法
- C++ 覆盖方法不起作用
- 代理dll:方法覆盖/方法转发(COM实现继承)