关于构造与析构过程中调用虚函数的问题

今天面试碰到一个构造函数与析构函数中调用需虚函数的问题,当时不太确定,回来敲了一下,发现确实表现的不一样,在网上一查发现另有玄机。

代码:

# gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 
#include <iostream> using namespace std; class A { public: A() { _print(); } ~A() { print_(); } virtual void _print() { cout << "a" << endl; } virtual void print_() { cout << "b" << endl; } }; class B : public A { public: B() { _print(); } ~B() { print_(); } virtual void _print() { cout << "c" << endl; } virtual void print_() { cout << "d" << endl; } }; int main(int argc, char** argv) { A *p = new B(); delete p; return 0; }

输出:

a

c

b

注:在vs2013下测试结果相同。

解析:

参照另一篇文章《基类析构函数为虚函数

1. 构造子类对象,依次调用父类和子类构造函数,依次打印a,c;

2. 释放对象,直接调用,指针类型的析构函数,即父类的析构函数,直接打印b;

注:

<<Effective C++>> 条款09 绝不在构造或析构过程中调用virtual函数。

posted on 2016-09-14 01:06  StoneHan  阅读(117)  评论(0)    收藏  举报

导航