在构造函数中调用虚函数

  一般地,父类指针new一个子类对象,通过调用虚函数可以实现多态,以调用不同的子类方法。

  但是在构造函数中调用虚函数则会不同。下面是例子:

class A
{
public:
	A()
	{
		cout << "A::A()" << endl;
		Foo();
	}

	virtual void Foo()
	{
		cout << "A::Foo()" << endl;
	}

	void Foo2()
	{
		cout << "A::Foo2()" << endl;
		Foo();
	}
};

class B : public A
{
public:
	B()
	{
		cout << "B::B()" << endl;
		Foo();
	}

	virtual void Foo()
	{
		cout << "B::Foo()" << endl;
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	cout << "test1:" << endl;
	A* pA = new B;

	cout << endl << "test2:" << endl;
	pA->Foo2();

	return 0;
}


  调用结果如下:

test1:
A::A()
A::Foo()
B::B()
B::Foo()

test2:
A::Foo2()
B::Foo()
请按任意键继续. . .



  可以看出,在父类构造时并不会调用子类的Foo()方法。而在调用A::Foo2()函数调用时则能够正常调用到派生类的Foo()方法。
  其实,此时,构造A时,子类并没有完成构造动作,如果此时调用,可能会发生不可预料的错误,因此会做此限制。
  所以,如果想要实现多态,还是等到初始化完成后,例如构建一个Create()方法来实现软创建,在其中实现不同的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值