当我从基类构造函数调用虚函数时,编译器不会报错。但是当我从基类构造函数调用纯虚函数时,它会给出编译错误。
考虑下面的示例程序:
这里可以看到纯虚函数有一个定义。我期望在执行bptr->virtualfunc()时会调用基类中定义的纯虚函数。然而实际上会出现编译错误:
考虑下面的示例程序:
#include <iostream>
using namespace std;
class base
{
public:
void virtual virtualfunc() = 0;
//void virtual virtualfunc();
base()
{
virtualfunc();
}
};
void base::virtualfunc()
{
cout << " pvf in base class\n";
}
class derived : public base
{
public:
void virtualfunc()
{
cout << "vf in derived class\n";
}
};
int main()
{
derived d;
base *bptr = &d;
bptr->virtualfunc();
return 0;
}
这里可以看到纯虚函数有一个定义。我期望在执行bptr->virtualfunc()时会调用基类中定义的纯虚函数。然而实际上会出现编译错误:
错误:从构造函数调用纯虚函数`virtual void base::virtualfunc()'
这是什么原因呢?
gcc-4.3.4
中,没有定义会出现错误,但是有定义没有错误,但是没有错误并不意味着它是正确的,它仍然是未定义行为。 - Alok Savebase::virtualfunc()
,这样就可以消除错误(同时在用户代码中明确调用内容)。请注意,在某些编译器中,即使是纯虚拟的,只要它被定义了,所涉及的代码也会实际调用base::virtualfunc()
而不会崩溃,但这只是另一种未定义行为的版本。 - David Rodríguez - dribeasbase::virtualfunc()
),这将导致链接器错误。 - David Rodríguez - dribeas