虚函数机制参考虚拟构造函数

DNa*_*mto 0 c++ constructor runtime-error compiler-errors vtable

这是在一次采访中向我提出的问题.

如果Vtable是在编译时创建的,并且vptr在运行时被分配给对象,那么如果我们的类中有虚拟构造函数,那么为什么编译器会给出编译时错误?

我解释了整个机制.但是他对' 为什么编译时错误而不是运行时错误 ' 更感兴趣

我告诉他,C++指南是用来编写的,因此编译器会在编译时发送错误.

能否请你告诉我同样的原因

Kir*_*rov 9

简单回答的棘手问题 - 因为没有虚拟构造函数C++.


在ISO标准中,ISO/IEC 14882:2003和ISO/IEC 14882:2011,12.1构造函数,第4点:

构造函数不应是虚拟(10.3)或静态(9.4).可以为const,volatile或const volatile对象调用构造函数.构造函数不应声明为const,volatile或const volatile(9.3.2).const和volatile语义(7.1.5.1)不适用于正在构造的对象.只有当派生的对象(1.8)的构造函数结束时,这种语义才会生效.

这可以在编译时捕获.

  • 当然这是对的......我试图在线条之间阅读他的意思*虚拟构造函数*和整个事情,但保持简单...... +1 (2认同)

Alo*_*ave 5

为什么编译时错误没有运行时错误?

运行时发生异常情况时发生运行时错误.当编译器检测到C++标准不允许特定构造作为有效C++构造时,会发生编译时错误.
C++标准不允许将构造函数标记为virtual.因此,编译器将其检测为违反语言语法规则并标记错误.

至于回答为什么在C++中不允许使用虚构造函数.
Bjarne在他的faq页面上回答Q:

虚拟调用是一种在给定部分信息的情况下完成工作的机制.特别是,"virtual"允许我们只知道任何接口而不是对象的确切类型来调用函数.要创建对象,您需要完整的信息.特别是,您需要知道要创建的内容的确切类型.因此,"对构造函数的调用"不能是虚拟的.