DNa*_*mto 0 c++ constructor runtime-error compiler-errors vtable
这是在一次采访中向我提出的问题.
如果Vtable是在编译时创建的,并且vptr在运行时被分配给对象,那么如果我们的类中有虚拟构造函数,那么为什么编译器会给出编译时错误?
我解释了整个机制.但是他对' 为什么编译时错误而不是运行时错误 ' 更感兴趣
我告诉他,C++指南是用来编写的,因此编译器会在编译时发送错误.
能否请你告诉我同样的原因
简单回答的棘手问题 - 因为没有虚拟构造函数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)的构造函数结束时,这种语义才会生效.
这可以在编译时捕获.
为什么编译时错误没有运行时错误?
运行时发生异常情况时发生运行时错误.当编译器检测到C++标准不允许特定构造作为有效C++构造时,会发生编译时错误.
C++标准不允许将构造函数标记为virtual.因此,编译器将其检测为违反语言语法规则并标记错误.
至于回答为什么在C++中不允许使用虚构造函数.
Bjarne在他的faq页面上回答Q:
虚拟调用是一种在给定部分信息的情况下完成工作的机制.特别是,"virtual"允许我们只知道任何接口而不是对象的确切类型来调用函数.要创建对象,您需要完整的信息.特别是,您需要知道要创建的内容的确切类型.因此,"对构造函数的调用"不能是虚拟的.