nit*_*ian 5 c++ constructor virtual-functions compiler-errors dynamic-binding
当我从基础构造函数调用虚函数时,编译器不会给出任何错误.但是当我从基类构造函数调用纯虚函数时,它会产生编译错误.
考虑下面的示例程序:
#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;
}
Run Code Online (Sandbox Code Playgroud)
这里可以看出纯虚函数有一个定义.我期望在bptr->virtualfunc()执行时调用基类中定义的纯虚函数.相反,它给出了编译错误:
错误:从构造函数调用的抽象虚拟`virtual void base :: virtualfunc()'
这是什么原因?
Alo*_*ave 10
不要从构造函数调用纯虚函数,因为它会导致未定义的行为.
C++ 03 10.4/6状态
"可以从抽象类的构造函数(或析构函数)调用成员函数;对于从这样的构造函数创建(或销毁)的对象,直接或间接地对纯虚函数进行虚拟调用(10.3)的效果(或析构函数)未定义."
您收到编译错误,因为您尚未virtualfunc()在Base类中定义纯虚函数.为了能够召唤它,它必须有一个身体.
无论如何,应该避免在构造函数中调用纯虚函数,因为这样做是未定义的行为.
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |