Bel*_*loc 17 c++ standards pure-virtual
从10.4 抽象类 parag.标准中的6:
"可以从抽象类的构造函数(或析构函数)调用成员函数;直接或间接地对从这样的构造函数(或析构函数)创建(或销毁)的对象进行纯虚函数的虚拟调用的效果未定义."
假设标准允许从构造函数(或析构函数)调用非纯虚函数,为什么区别?
[编辑]关于纯虚函数的更多标准引用:
§10.4/ 2通过在类定义中的函数声明中使用纯说明符(9.2)来指定虚函数.只有在使用(12.4)qualified-id语法(5.1)调用时,才需要定义纯虚函数.... [注意:函数声明不能同时提供纯指定符和定义-end note]
§12.4/ 9 析构函数可以声明为虚拟(10.3)或纯虚拟(10.4); 如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数.
一些需要回答的问题是:
如果纯虚函数没有给出实现,那么这不应该是编译器或链接器错误吗?
在为纯虚函数赋予实现的情况下,为什么在这种情况下不能很好地定义它来调用这个函数?
Chr*_*odd 12
因为虚拟调用永远不能调用纯虚函数 - 调用纯虚函数的唯一方法是使用显式(合格)调用.
现在在构造函数或析构函数之外,这是由于您永远不能实际拥有抽象类的对象这一事实.你必须有一个非抽象派生类的对象来覆盖纯虚函数(如果它没有覆盖它,那么类就是抽象的).但是,当构造函数或析构函数正在运行时,您可能具有中间状态的对象.但是,由于该标准表明在这种状态下尝试虚拟调用纯虚函数会导致未定义的行为,因此编译器可以自由地使用特殊情况来使其正确,从而为实现纯虚函数提供了更大的灵活性.特别是,编译器可以像实现非纯虚拟(无需特殊情况)一样自由地实现纯虚拟,如果从ctor/dtor调用纯虚拟,则崩溃或以其他方式失败.