学习子类的构造和析构顺序
1 构造函数不能是虚函数
2 当析构函数不是虚函数时:父指针子对象时:构造是父—>子,析构是父;
3 当析构函数不是虚函数时:子指针子对象时:构造是父—>子,析构是子—>父;
4 当析构函数是虚函数时:父指针子对象时:构造是父—>子,析构是子—>父;
5 构造和析构函数中的虚函数都不能触发多态行为。
代码:
1 #include <stdlib.h> 2 3 /** 4 * @author:zanzan101 5 */ 6 class A 7 { 8 public: 9 A(){ 10 printf("Ac\n"); 11 todo(); 12 } 13 virtual ~A(){ 14 printf("Ad\n"); 15 todo(); 16 } 17 virtual void todo() 18 { 19 printf("A: todo\n"); 20 } 21 }; 22 class B: public A 23 { 24 public: 25 B(){ 26 printf("Bc\n"); 27 todo(); 28 } 29 virtual ~B(){ 30 printf("Bd\n"); 31 todo(); 32 } 33 void todo() 34 { 35 printf("B: todo\n"); 36 } 37 }; 38 39 int main() 40 { 41 printf(">> 父指针子对象\n"); 42 A* p = new B(); 43 44 printf("----------\n"); 45 p->todo(); 46 printf("----------\n"); 47 delete p; 48 49 50 printf(">> 子指针子对象\n"); 51 B* q = new B(); 52 printf("----------\n"); 53 q->todo(); 54 printf("----------\n"); 55 delete q; 56 57 58 system("pause"); 59 60 return 0; 61 }
输出:
>> 父指针子对象 Ac A: todo Bc B: todo ---------- B: todo ---------- Bd B: todo Ad A: todo >> 子指针子对象 Ac A: todo Bc B: todo ---------- B: todo ---------- Bd B: todo Ad A: todo 请按任意键继续. . .
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步