C++子类调用父类虚函数

众所周知,子类虚函数指针会把父类虚函数指针覆盖,如果要子类调用父类虚函数,方法如下

复制代码
 1 class Father
 2 {
 3     virtual void show(){cout<<"this is father."<<endl;}
 4 };
 5 
 6 class Son
 7 {
 8    virtual void show(){cout<<"this is son."<<endl;} 
 9 };
10 
11 int main()
12 {
13     Father* f = new Son;
14     f->show();    //  输出“this is son.”
15     f->Father::show();    //  输出“this is father.”
16     return 0;
17 }
复制代码

 

扩展:如果继承方式是A>B>C>D(A基类往下衍生),B* b = new D   能访问到的到哪一步的虚函数?

复制代码
 1 class A
 2 {
 3 public:
 4     A() { cout << "constructor A." << endl; }
 5     virtual void show() { cout << "this is A." << endl; }
 6     virtual ~A() { cout << "destructor A." << endl; }     //  这里必须加virtual 不然子类不会调用析构函数
 7 };
 8 
 9 class B : public A
10 {
11 public:
12     B() { cout << "constructor B." << endl; }
13     virtual void show() { cout << "this is B." << endl; }
14     ~B() { cout << "destructor B." << endl; }
15 };
16 
17 class C : public B
18 {
19 public:
20     C() { cout << "constructor C." << endl; }
21     virtual void show() { cout << "this is C." << endl; }
22     ~C() { cout << "destructor C." << endl; }
23 };
24 
25 class D : public C
26 {
27 public:
28     D() { cout << "constructor D." << endl; }
29     virtual void show() { cout << "this is D." << endl; }
30     ~D() { cout << "destructor D." << endl; }
31 };
32 
33 int main()
34 {
35     B* b = new D;
36     b->show();
37     b->A::show();
38     b->B::show();
39         //  b->C::show();  // 报错,限定名不是类"B"或其基类
40     C* c = static_cast<C*>(b);  //  转换为类C
41     c->show();
42     c->C::show();  //  输出"this is C."
43     delete c;
44     return 0;
45 }
复制代码

 结果很明显,B* b = new D 能访问到A、B、D的show()虚函数,若要访问到C,转换为类C后再访问即可。如下图所示,因为new D的时候,分配了ABCD总共4个类的空间(好浪费内存),既然开辟了,那么类C虚函数肯定是存在的。

 顺便再强调一下,若父类析构函数没有加virtual关键字,以非子类声明指针,子类不会调用析构函数,结果如下

 如果没有转换成类C,那么B* b = new D,在delete b时,只会调用A和B的析构函数,无形中产生内存泄漏。

 

posted @   补码  阅读(4280)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示