构造函数中调用虚函数
调用的是基类中的函数不是调用派生类的,因为派生类还未构造完成。保持构造函数精简,可以把一些操作抽出来放在成员函数中,一般不要在构造函数中调用虚函数。
调用基类构造函数,需要放在初始化列表中,放在派生类函数体里就会调用两次基类的构造函数,第一次是编译器插入的调用基类的无参构造函数。
构造函数与析构函数调用顺序相反,大概是因为,派生类可能使用基类的数据
虚析构函数,当使用基类指针析构派生类对象时,保证调用正确的析构函数
下面给出一段测试代码:
1 class A{ 2 public: 3 A(){ 4 printf("构造 A\n"); 5 f(); 6 } 7 virtual void f(){ 8 printf("A.f()\n"); 9 }10 virtual ~A(){11 printf("析构 A\n");12 }13 };14 15 class B: public A{16 public:17 B(): A(){18 printf("构造 B\n");19 f();20 }21 virtual void f(){22 printf("B.f()\n");23 }24 virtual ~B(){25 printf("析构 B\n");26 }27 };28 29 int main(){30 A *p = new B();31 p->f();32 delete p;33 return 0;34 }
运行结果:
[lym@localhost tmp]$ ./a.out构造 AA.f()构造 BB.f()B.f()析构 B析构 A
上面所说的几点,应该都可以看出来。
另外:
定义变量时,对于单参构造函数
Foo apple = 8; 与 Foo apple(8); 是等价的。
原文链接: https://www.cnblogs.com/liyongmou/archive/2011/04/22/2024629.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/24386
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!