【发布时间】:2014-03-03 04:59:26
【问题描述】:
我相信我们都见过由于导致调用纯虚函数的错误而崩溃的代码。一个简单的例子是这样的:
struct Base
{
Base() { method(); }
virtual void method() = 0;
};
struct Derived : Base
{
void method() {};
};
int main()
{
Derived d;
}
在这种情况下,Base 构造函数中对method() 的调用被 C++ 标准的第 10.4/6 节明确引用为未定义行为,因此我们最终崩溃也就不足为奇了。 (g++ 和 Clang 都对此发出警告,事实上,在这个例子中,g++ 的链接失败了,尽管 Clang 成功了。)
但是,只是为了好玩,谁能想出一种方法来调用不依赖于未定义行为的纯虚函数?
(我想你可能会争辩说,如果存在这样的方法,那么 C++ 标准就有缺陷,但我只是好奇……)
编辑:几个答案,谢谢,但我应该明确表示,我意识到对纯虚函数进行非虚调用是合法的(前提是某处存在定义) .我更想知道法律中是否有任何巧妙的漏洞可能导致虚拟通话,因此很可能在没有定义的常见情况下崩溃。
例如,也许通过多重继承可以执行一些巧妙的(合法的)转换,但最终会调用“错误的”(未实现的)PV method(),诸如此类。我只是觉得这是一个有趣的脑筋急转弯:-)
【问题讨论】:
-
看起来是language-lawyer 标记的不错候选者,但您已经是 5 岁了。您可以考虑重新标记。
-
@Angew 好电话,已更改
-
好吧,没有什么可以阻止你实现那个纯虚函数,然后从那个ctor上下文中调用它就好了。
-
三个字:纯虚析构函数。谷歌一下。
-
@user2079303 是的。只要是
= 0,它就是一个纯虚函数,并导致包含它的类是抽象的。
标签: c++ c++11 language-lawyer undefined-behavior pure-virtual