为什么不能在构造函数中使用虚函数

先上代码:

// c_datastructure.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<string>

using namespace std;

class Base {
public:
	Base() {
		fun();
	}
	virtual void fun() { cout << "Base" << endl; }
};
class A :public Base {
public:
	A() :Base(), a(a) {}
	virtual void fun() { cout << "A" << endl; }
private:
	int a;
};


int main()
{
	cout << "************" << endl;

	Base *a = new A;
	delete a;
    return 0;
}

此时发挥作用的是Base:fun()而不是派生类A:fun(),也就是虚函数在构造函数中不起作用。 当实例化一个派生类对象时,首先进行基类部分的构造,然后再进行派生类部分的构造。即创建A对象时,会先调用Base的构造函数,再调用A的构造函数。 当在构造基类部分时,派生类还没被完全创建,从某种意义上讲此时它只是个基类对象。即当Base::fun()执行时A对象还没被完全创建,此时它被当成一个Base对象,而不是A对象,因此fun绑定的是Base的fun

C++之所以这样设计是为了减少错误和Bug的出现。假设在构造函数中虚函数仍然“生效”,即Base::fun()中的fun();所调用的是A::fun()。当Base::fun()被调用时派生类中的数据a还未被正确初始化,这时执行A::fun()将导致程序对一个未初始化的地址解引用,得到的结果是不可预料的,甚至是程序崩溃(访问非法内存)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值