C++多态深度解析
2022/6/15 5:20:10
本文主要是介绍C++多态深度解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一.多态的概念
通过使用virtual关键字对多态进行支持,被virtual声明的函数被重写后具有多态特性,virtual声明的函数叫虚函数。
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Parent 7 { 8 public: 9 virtual void print() //使用virtual,变成虚函数(这个函数可能在子类被重写) 10 { 11 cout << "I'm Parent." << endl; 12 } 13 }; 14 15 class Child : public Parent 16 { 17 public: 18 void print() //由于继承关系,这里也是虚函数,只是可以省略不写 19 { 20 cout << "I'm Child." << endl; 21 } 22 }; 23 24 void how_to_print(Parent* p) 25 { 26 p->print(); // 展现多态的行为 27 } 28 29 int main() 30 { 31 Parent p; 32 Child c; 33 34 how_to_print(&p); // Expected to print: I'm Parent. 35 how_to_print(&c); // Expected to print: I'm Child. 36 37 return 0; 38 }
结果:
1 I'm Parent. 2 I'm Child.
子类中重写的函数将覆盖父类中的函数,虽然被重写覆盖了,但通过作用域分辨符(::)可以访问到父类中的函数。
二.虚函数与纯虚函数
纯虚函数和虚函数都是使用virtual关键字,只是纯虚函数在函数原型后面加上“=0”,纯虚函数没有实例化,虚函数有函数体,有实例化,定义纯虚函数是为了实现一个接口,起到一个规范的作用。
1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 public: 7 virtual void f(const string& str)=0; 8 virtual void e() { 9 cout << "Base e() : " << endl; 10 } 11 }; 12 // 缺省实现,纯虚函数可以有函数体,但必须类的外部定义,如果子类不想实现,可以调用基类的 13 void A::f(const string& str) { 14 cout << "A f()" << str << endl; 15 } 16 17 class B : public A{ 18 public: 19 // 本质上还是重写了,只不过直接调用了基类的函数实现 20 virtual void f(const string& str){ 21 cout << "Call A::f " << endl; 22 A::f(str); 23 } 24 void e(){ 25 cout << "B e()" << endl; 26 } 27 }; 28 29 int main() 30 { 31 B b; 32 b.f("hello world"); 33 b.e(); 34 A *a = new B(); 35 // 都是多态 36 a->f("hello"); 37 a->e(); 38 return 0; 39 }
三.对象的内存布局
对象的内存布局包括两方面:成员变量的内存,指向虚函数表指针的内存,静态变量与成员函数是不占用对象内存的。
这篇关于C++多态深度解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版