C++ 构造和析构期间不要调用虚函数
2013-07-12 17:08
357 查看
在虚基类的构造函数中,调用虚函数和纯虚函数存在不同,如下代码:
上面的例子将会输出:
是不是有点不可思议.
在创建testObj对象时,实际执行过程是:
1)new TestSon() 时,首先调用基类的构造函数TestParent::TestParent()
2)当执行TestParent::TestParent()时,当前实例化的指针的类型还不是TestSon,它的类型是TestParent。因此这时调用了TestParent::say()。
C++箴言:
·在构造和析构期间不要调用虚函数,因为这样的调用不会匹配到当前执行的构造函数或析构函数所属的类的更深的派生层次。
参见C++
FAQ Lite
#include <iostream> class TestParent { public: TestParent() { say(); //compile error //work(); } virtual ~TestParent(){} virtual void say(){printf("this is parent!\n");} virtual void work() = 0; }; class TestSon : public TestParent { public: TestSon() { } virtual ~TestSon(){} virtual void say(){printf("this is son!\n");} virtual void work(){printf("the son is working...\n");} }; int main(int argc, char *argv[]) { TestParent *testObj = new TestSon(); delete testObj; return 0; }
上面的例子将会输出:
this is parent!
是不是有点不可思议.
在创建testObj对象时,实际执行过程是:
1)new TestSon() 时,首先调用基类的构造函数TestParent::TestParent()
2)当执行TestParent::TestParent()时,当前实例化的指针的类型还不是TestSon,它的类型是TestParent。因此这时调用了TestParent::say()。
C++箴言:
·在构造和析构期间不要调用虚函数,因为这样的调用不会匹配到当前执行的构造函数或析构函数所属的类的更深的派生层次。
参见C++
FAQ Lite
相关文章推荐
- c++ 构造没完成 别的对象不能访问 析构时基类不要调用虚函数
- C++-不要在构造和析构函数中调用虚函数
- 不要在构造或析构的过程中调用虚函数
- Item 9: 绝不要在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数)
- C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)
- 永远 不要在构造或析构的过程中调用虚函数
- 在构造和析构期间不要调用virtual函数
- Effective c++(3th) Item9:绝不要在构造和析构期间调用虚拟函数
- C++ 笔记(二) —— 不要在构造和析构函数中调用虚函数
- [翻译] Effective C++, 3rd Edition, Item 9: 绝不要在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数)
- C++不要在构造函数和析构函数中调用虚函数
- 程序入口函数和glibc及C++全局构造和析构
- C++箴言:避免构造或析构函数中调用虚函数 zz
- 构造/析构函数中不要调用虚函数
- 【转】C++箴言:避免构造或析构函数中调用虚函数
- 《Effective C++ 》条款9:永远不要在构造函数或析构函数中调用虚函数
- c++构造和析构的调用
- C/C++函数中局部对象的构造与析构时机
- C++学习笔记:3.3.4 继承和组合混搭情况下,构造和析构调用顺序
- 类中嵌套另一个类时,调用构造,析构,拷贝,赋值运算符等函数的次序