在构造函数中调用虚函数

原创 2013年12月04日 14:35:43

  一般地,父类指针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()方法来实现软创建,在其中实现不同的方法。

相关文章推荐

C++中构造函数中调用虚函数的问题 转载

在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。 struct C180 ...

为什么不要在构造函数中调用虚函数

为什么不要在构造函数中调用虚函数 转自  http://www.cnblogs.com/carter2000/archive/2012/04/28/2474960.html 先看一...

构造函数调用虚函数

今天看android canvas 类的源代码看到 Canvas的构造函数之一: public class Canvas{ ... public Canvas() { if (...
  • techx
  • techx
  • 2015年08月04日 14:06
  • 313

C++构造函数调用虚函数的问题

环境:XPSP3 VS2005         今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码: class Base { pu...
  • zhu2695
  • zhu2695
  • 2013年07月25日 12:16
  • 589

构造函数能否调用virtual 虚函数

之前有看到在Effective C++中提及,在构造函数里面是否可以调用虚函数。在书中是明前表示不建议我们这么干的。原因也很明确,就是在构造函数中,是无法执行到派生类中对应的函数接口的。但是,是否真的...

C++中构造函数中调用虚函数的问题

注: 这里是参考参考stroustrup的回答吧(http://www.research.att.com/~bs/bs_faq2.html#vcall), 个人觉得对ATL中关于ATL_NO_VATB...

为什么不要在构造函数中调用虚函数

为什么不要在构造函数中调用虚函数 先看一段在构造函数中直接调用虚函数的代码: 1 #include 2 3 class Base 4 { 5 public: ...

C++ 构造函数中能调用虚函数吗

答案是可以的,只是起不到虚函数的作用,举例如下:   #include using namespace std; class Base  {  public:   Base() ...

C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)

问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。...

C++中构造函数能调用虚函数吗

以、看如下的代码: [cpp] view plaincopy class Base   {   public:       Base()      ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在构造函数中调用虚函数
举报原因:
原因补充:

(最多只允许输入30个字)