在构造函数中调用虚函数

原创 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++ 构造函数中调用虚函数

我们知道:C++中的多态使得可以根据对象的真实类型(动态类型)调用不同的虚函数。这种调用都是对象已经构建完成的情况。那如果在构造函数中调用虚函数,会怎么样呢? 有这么一段代码: class A...
  • coderCong
  • coderCong
  • 2016年07月29日 15:03
  • 1240

构造函数与析构函数中不调用虚函数

在C++中,提倡不能在构造函数和析构函数中调用虚函数。 这是为什么呢?首先,我们先回顾一下C++虚函数的作用。 虚函数的引入是c++运行时多态的体现,通过调用虚函数可以在运行程序时实现动态绑定,体现...
  • linpengbin
  • linpengbin
  • 2016年06月02日 00:44
  • 940

C++面试题1:构造函数和虚构函数中能否调用虚函数?

C++面试题1:构造函数和虚构函数中能否调用虚函数? 构造函数跟虚构函数里面都可以调用虚函数,编译器不会报错。C++ primer中说到最好别用由于类的构造次序是由基类到派生类,所以在构造函数中...
  • u010555622
  • u010555622
  • 2014年09月08日 09:46
  • 1381

在构造函数/析构函数中调用虚函数

先看一段在构造函数中直接调用虚函数的代码: 1 #include 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } ...
  • xtzmm1215
  • xtzmm1215
  • 2015年04月19日 17:32
  • 2996

能不能在构造函数和析构函数中调用虚函数?

可以,但是达不到想要的效果,应该尽可能避免在构造函数和析构函数中调用虚函数。 class base{ public: base(){ cout...
  • ljlstart
  • ljlstart
  • 2016年04月16日 10:52
  • 983

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

问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。...
  • Linux_ever
  • Linux_ever
  • 2016年04月04日 13:50
  • 954

构造函数中调用虚函数能否实现多态

问:构造函数中调用虚函数能否实现多态? #include using namespace std; class Parent { public: Parent(int a = 0) { t...
  • bbs375
  • bbs375
  • 2016年09月25日 08:26
  • 713

为什么构造函数中调用的虚函数不具有多态性?

effective c++ 的item9中提到,不要在构造函数中调用虚函数,因为此时的虚函数不具有多态性。  给出的原因是说构造基类的时候,还未初始化派生类的成员变量。而网上很多说法说是虚表未建立。 ...
  • HelloElite
  • HelloElite
  • 2017年04月21日 21:13
  • 331

C++不要在构造函数和析构函数中调用虚函数

虽然可以对虚函数进行实调用,但程序员编写虚函数的本意应该是实现动态联编。在构造函数中调用虚函数,函数的入口地址是在编译时静态确定的,并未实现虚调用。但是为什么在构造函数中调用虚函数,实际上没有发生动态...
  • K346K346
  • K346K346
  • 2015年11月16日 21:25
  • 1829

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

1 #include 2 using namespace std; 3 4 struct C180 5 { 6 C180() { 7 foo(); 8 ...
  • a1222234
  • a1222234
  • 2015年03月04日 10:47
  • 613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在构造函数中调用虚函数
举报原因:
原因补充:

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