- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这样安全吗?
class Derived: public PublicBase, private PrivateBase
{
...
~Derived()
{
FunctionCall();
}
virtual void FunctionCall()
{
PrivateBase::FunctionCall();
}
}
class PublicBase
{
virtual ~PublicBase(){};
virtual void FunctionCall() = 0;
}
class PrivateBase
{
virtual ~PrivateBase(){};
virtual void FunctionCall()
{
....
}
}
PublicBase* ptrBase = new Derived();
delete ptrBase;
这段代码有时使用错误地址中的 IP。
在构造函数上调用虚函数不是一个好主意,每个人都清楚。
来自 http://www.artima.com/cppsource/nevercall.html 等文章我知道析构函数也不是调用虚函数的好地方。
我的问题是“这是真的吗?”我已经用 VS2010 和 VS2005 进行了测试,并且调用了 PrivateBase::FunctionCall。是未定义的行为吗?
最佳答案
我将在这里逆流而上...但首先,我必须假设您的 PublicBase
析构函数是虚拟的,否则 Derived
析构函数将永远不会是调用。
从构造函数/析构函数调用虚函数通常不是一个好主意
原因是在这两个操作期间动态调度很奇怪。对象的实际类型在构造过程中更改,而在销毁过程中又更改。当一个析构函数被执行时,对象就是那个类型,而不是从它派生的类型。动态调度始终有效,但虚函数的最终覆盖器会根据你在层次结构中的位置而改变。
也就是说,您永远不应期望在构造函数/析构函数中调用虚函数,以任何派生自正在执行的构造函数/析构函数类型的类型执行。
但是
在您的特定情况下,final 覆盖器(至少对于层次结构的这一部分)是 高于您的级别。此外,您根本没有使用动态调度。 PrivateBase::FunctionCall();
调用是静态解析的,实际上等效于对任何非虚拟函数的调用。该函数是否为虚拟这一事实不影响此调用。
所以是的按照您的方式做是很好的,尽管您将被迫在代码审查中解释这一点,因为大多数人都了解规则的真言而不是其原因。 p>
关于c++ - 从析构函数调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092933/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!