为什么没有调用我的覆盖方法
Why is my override method not being called?
可能是一个简单的问题。我注意到许多类似的问题,但似乎都没有解决我的问题,因此我的帖子。
基数:
class Base
{
public:
Base();
protected:
virtual void Create() {}
};
底座.cpp:
Base::Base()
{
Create();
}
儿童:
class Child : public Base
{
protected:
void Create() override;
};
儿童.cpp:
void Child::Create()
{
// Work happens here
}
Create
是在Base
而不是Child
上调用的,当我创建Child
时。为什么不Create
Child
?
从基类的 ctor 调用虚拟方法时,将调用基类的虚拟方法。这就是语言的定义方式。这是有原因的,例如:
void Child::Show()
{
// Some work that requires data fields of derived class.
}
如果要从基类的 ctor 调用派生类中的Show
,Child::Show
将使用 Child
的数据字段,但派生类的 ctor 尚未调用。
还有其他相关的点值得注意。想象:
class Base // The class is abstract.
{
public:
Base() { Show(); }
protected:
virtual void Show() = 0;
};
class Child : public Base
{
protected:
void Show() override { /* Some work */ }
};
在这种情况下,当您创建Child
的任何实例时,程序将崩溃,因为纯虚拟方法尚未实例化。这将在稍后完成,当隐藏部分Child
的 ctor 将工作时。ctor 的这个隐藏部分修改了对象的 VMT(虚拟方法表(。当一个复杂的物体被摧毁时,也会发生类似的故事。VMT 可以根据基类链的复杂性进行多次修改。
构造函数很特殊。当您在构造函数中时,派生类尚未构造,因此它实际上不存在 - 构造函数首先执行 base,其次执行派生。从基类构造函数进行的任何成员调用都将是基类成员。
对象是从头开始构建的。
当您尝试从 Base
的构造函数中调用 Create
(和其他成员函数(时,它会选取给定静态类型提供的正确定义,即 Base
。
换句话说,不要依赖于构造函数中的虚拟成员函数。
相关文章:
- 循环依赖,在继承类的情况下使用覆盖方法
- 确保模拟的 GTest 方法覆盖虚拟方法
- 覆盖作为另一个类的好友的虚拟受保护方法
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 有没有办法仅在两个模板参数相同时才覆盖匹配的模板方法?
- C ++中的方法覆盖:是编译时还是运行时多态性?
- 错误"pure virtual method called",当此方法已被覆盖时
- 覆盖方法并用shared_ptr调用它们的奇怪行为
- 仅适用于某些模板类型的覆盖方法
- 在某些代码中覆盖方法的方式是什么?
- 为什么没有调用我的覆盖方法
- Poylmorphim,构造函数-C 中使用的覆盖方法
- 覆盖方法返回类型,在C 中使用不完整的派生类
- 从基类执行覆盖方法
- 如何自动化覆盖方法
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- 为什么不调用这个 Ruby 覆盖方法
- C++ 覆盖方法不起作用
- 代理dll:方法覆盖/方法转发(COM实现继承)