我觉得这很奇怪。在Sample_Base的ctor中,我调用了内部调用fun()的bar(),它是一个纯虚函数。我得到了称为“纯虚函数”的错误。这很好。现在,如果我直接从Sample_Base的ctor调用fun(),我不会得到那个错误。我在VC++ 2010 Beta 2和Ubuntu 9.10上的g ++ 4.4.1上尝试过。我同意,除了纯虚拟析构函数之外,为纯虚函数提供实现是没有意义的。但是,我对这种行为有点惊讶。纯虚函数调用error
class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/
void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};
Sample_Base::~Sample_Base()
{
}
void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}
class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}
void fun()
{
std::cout << "Sample_Derived::fun\n";
}
~Sample_Derived()
{
}
};
[C++标准](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf)§10.4.6指出“虚拟调用纯虚函数...正在创建的对象...未定义“。你能评论一下吗?我会读它直接调用'fun'也应该是未定义的(即使编译器在这种特定情况下不会产生崩溃的程序)。或者这不是在这种情况下的虚拟调用(如果是这样,为什么,我无法在标准中找到它)。 – Xlea 2015-04-23 13:13:59
@Xlea Charles Bailey在答案中指出了标准的正确部分。请注意,他当时正在使用C++ 03标准,因此现在章节号会有所不同,但这可能会引导您。 – Gorpik 2015-04-24 07:41:33