关于构造与析构过程中调用虚函数的问题
今天面试碰到一个构造函数与析构函数中调用需虚函数的问题,当时不太确定,回来敲了一下,发现确实表现的不一样,在网上一查发现另有玄机。
代码:
# 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函数。
浙公网安备 33010602011771号