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的析构函数,无形中产生内存泄漏。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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 让容器管理更轻松!