我确信我们都看到代码崩溃,由于一个错误,导致一个纯粹的虚拟函数被调用.一个简单的例子就是这样:
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方法().我只是以为这是一个有趣的脑力激荡:-)
解决方法
原文地址:https://www.jb51.cc/c/114153.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。