C++ 2调用构造函数中的纯虚函数时出错?

C++ 2调用构造函数中的纯虚函数时出错?,c++,C++,它会导致编译错误吗。若有,原因为何。如果否,为什么?首先,从构造函数调用纯虚拟是未定义的行为 C++11§10.4/6: “作出决定的效果 直接或间接为正在创建(或销毁)的对象对纯虚拟函数的虚拟调用(10.3) 从这样的构造函数(或析构函数)是未定义的。” 那么你的问题是UB是否需要诊断 事实并非如此 虽然注释不是规范性的,但C++11§1.3.24中的以下注释澄清了: “允许的未定义行为 从完全忽略情况到结果不可预测,再到在翻译或翻译过程中的行为 以环境特有的文件化方式执行程序(无论是否发布

它会导致编译错误吗。若有,原因为何。如果否,为什么?

首先,从构造函数调用纯虚拟是未定义的行为

C++11§10.4/6:

“作出决定的效果 直接或间接为正在创建(或销毁)的对象对纯虚拟函数的虚拟调用(10.3) 从这样的构造函数(或析构函数)是未定义的。”

那么你的问题是UB是否需要诊断

事实并非如此

虽然注释不是规范性的,但C++11§1.3.24中的以下注释澄清了:

“允许的未定义行为 从完全忽略情况到结果不可预测,再到在翻译或翻译过程中的行为 以环境特有的文件化方式执行程序(无论是否发布 诊断信息“

您的编译器,以及您选择的特定选项,可能会或可能不会发出诊断,然后可能会或可能不会生成可执行文件。如果确实如此,则构造函数的执行可能会或不会导致某些运行时错误。简而言之,这是未定义的行为


为什么调用行为未定义?例如,为什么它不能调用派生类中的实现

如果可以,那么派生类中的代码可以在派生类实例初始化之前执行,这意味着它可以在对实例变量值错误假设的情况下执行,这意味着它很容易导致bug

这就是Java和C的情况

在C++中,代码的构造函数或析构函数在代码< > >代码>中的执行是用< <代码> > < <代码> >对象>强>动态类型< /强>代码> t>代码>。此处对虚拟函数的调用具有与对象最初实例化为
T
时相同的效果(即使
T
具有纯虚拟函数)。这确保了代码的效果独立于在派生类中可以执行的操作,从而确保作为
T
程序员的您真正知道手头上有什么


使用这些类型更安全的规则,不可能有纯虚函数的任何派生类实现,因为在此上下文中,对象没有派生类部分:它纯粹是一个
t
对象。

是的,它将导致错误

纯虚拟函数用于使类抽象,这意味着从该类继承的任何类都必须实现虚拟函数


例如,假设您有一个从类a继承的类B,您必须在那里实现draw()方法,您可以在那里调用它。但是您从未在定义纯虚函数的类中调用过它。

难道您没有一个编译器可以尝试一下吗?如果是,你为什么不这样做?如果没有,为什么没有编译器?千万不要在构造函数和析构函数中调用虚函数。@cbel:你的建议对Java和C#都很有用。但是,在C++中,这种非纯虚函数调用是安全的。这是一个罕见的情况下,C++是更安全的,然后上述语言。
class A{
public:
A(){
this->draw();
}
  virtual void draw()=0;
};