关于虚函数,构造函数,非构造函数之间的交叉调用
首先,上代码(还是代码引发的血案)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class A { public : A(){ this ; print(); } virtual void print(){ this ; cout<< "A" <<endl; } void think(){ this ; print(); } virtual ~A(){} private : }; class B: public A { public : B( int temp):A(),x(temp) { } virtual void print() override { this ; cout<< "B" <<endl; } virtual ~ B(){} private : int x; }; |
B b(3);
b.think();
输出的结果:
A
B
为什么会出现这种情况呢?
因为子类并不继承父类的构造函数和析构函数!!!
相反会继承成员函数和虚函数,
在执行子类的构造函数时,会调用父类的构造函数,记住,是调用,也就是A::A(),这样一来,是进入了A类的作用域,this指针也就是A类对象的this指针
而执行成员函数时,因为继承的关系,所以一直处于子类的作用域,
记住,只要是子类继承父类,除了构造函数和析构函数之外,根本不存在父类的作用域,this指针全部都是子类对象的指针!!!!
亲爱的听众朋友我是你的代班DJ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步