首页 > 编程语言 >C++ 多态深入解析

C++ 多态深入解析

时间:2023-08-09 20:33:24浏览次数:37  
标签:解析 函数 多态性 多态 C++ 调用 子类 print 父类

@TOC

前言

在C++编程中,多态性(Polymorphism)是一种重要的概念,它允许基于对象的实际类型来调用不同的函数。多态性提供了灵活性和可扩展性,使得代码更易于维护和扩展。


一、什么是多态

多态性的定义: 多态性是一种面向对象编程的特性,它允许使用基类的指针或引用来调用派生类对象的特定成员函数。多态性能够在编译时或运行时确定函数的调用,从而实现不同的行为

例如: 定义一个基类的 指针 p , 基类 和 子类的都定义有 print() 函数。当 p 指向一个父类的对象时,会调用父类的 print 函数;当 p 指向一个 子类对象时, 会调用 子类的 print 函数。(如下图)

注意: 这里 的 两个 print 函数并不是 函数重载,因为 函数重载要发生在同一个作用域内。这 属于函数重写。

C++ 多态深入解析_子类

二、如何实现多态

C++ 语言 直接支持多态的概念。

  • 通过使用 virtual 关键字 对多态进行支持。
  • virtual 声明的函数被重写后具有多态特性。
  • virtual 声明的函数叫做 虚函数
class Base {
public:
  virtual void display() 			//  virtual 虚函数
  {
    cout << "Base class display function" << endl;
  }
};

如果一个基类中有虚函数,说明 它可能被继承。子类中可能重新定义了 该函数的新用法。

三、代码讲解

下面代码中 ,父类 和 子类中 都定义了 print 函数。当 父类指针 指向不同的对象时,会根据实际的对象类型决定函数的具体目标。

class Parent							// 父类 (基类)
{
public:
	virtual void print()					// 虚函数
	{	
		printf("I'm parent.\n");
	}
};

class Child : public Parent				  // 继承 Parent 的子类
{
public:
	void print()							//重定义 该函数的新用法
	{
		printf("I'm Child\n");
	}
};

void to_printf(Parent* p)					// 参数为 父类指针,用于指向 父类/子类对象
{
	p->print();
}

int main(void)
{
	Parent p1;
	Child c1;

	to_printf(&p1);							//指向 父类对象,调用父类的 print 函数
	to_printf(&c1);							//指向 子类对象,调用子类的 print 函数

	return 0;
}

C++ 多态深入解析_父类_02

当调用 print 函数时, 同样的调用语句 在实际运行时有多种不同的表现形态,体现了多态性。

注意

如果,没有 加上 关键字 virtual ,则两次都会调用 父类的函数。因为 编译器不知道指针 p 究竟指向了什么,为了更安全,编译器就直接调用了父类的函数,赋值兼容性。

C++ 多态深入解析_父类_03

四、静态联编,动态联编

理论的概念:

  1. 静态联编: 在程序的编译期间就能确定具体的函数调用。

如: 函数重载。

  1. 动态联编: 在程序运行后才能确定具体的函数调用。

如:函数重写。


总结

多态性 是 C++ 编程中一个重要且强大的概念。通过使用虚函数和函数重写,我们可以实现多态性,从而提高代码的可维护性、可扩展性和灵活性。在编写代码时,我们应该充分利用多态性的优势,并遵循良好的面向对象设计原则来正确使用多态性。

标签:解析,函数,多态性,多态,C++,调用,子类,print,父类
From: https://blog.51cto.com/u_16159289/7024919

相关文章

  • yaml-cpp生成yaml文件及解析yaml文件
    1) 源码编译及安装获取源码$git clone https://github.com/jbeder/yaml-cpp.git$cd yaml-cpp && mkdir build && cd build && cmake .. && make && make install使用样例:由于yaml格式文件与xml和json格式的文件类似,采用树形结构。Yaml对于树节点定义为No......
  • ACM之2000——2050题目答案及解析
    /*****************************2000题**********************************/#include<iostream>#include<algorithm>使用C++中的库函数,实现字符位置调整usingnamespacestd;intmain(void){charn[4];while(cin>>n){if(n[0]>n[1]......
  • C++11新特性
    1.auto2.&&3.初始化列表vector<int>vec{1,2,3,4,5};4.范围for5.Lambda6.nullptr7.智能指针shared_ptrunique_ptrweak_ptr......
  • C++流
    C++中流的概念在程序设计中,数据输入输出(I/O)操作是必不可少的,C++语言的数据输入/输出操作时通过I/O流库来实现的。C++中把数据之间的传输操作称为流,流既可以表示数据从内存传送到某个载体或设备中,即输出流,也可以表示数据从某个载体或设备传送到内存缓冲区变量中,即输入流。C++中的......
  • ActionBar样式解析
    Android的装饰风格有多种,这些风格的不同之处主要体现在标题栏区域。比如最普通的标题栏仅有图标和标题。还有一些其他的风格,如带进度条的标题栏等。       在Android4.0上,有了新的标题栏,名为ActionBar,它提供了能强大的功能,如支持TAB页,支持菜单等。下面将分析主要的ActionBar......
  • 新东方在线:2014年6月四级作文真题范文及解析
    新东方在线:2014年6月四级作文真题范文及解析 题:Supposeaforeignfriendofyoursisgoingtovisityourhometown/yourcampus/China(多题多卷的三个不同),whatisthemostinterestingplaceyouwouldliketotakehim/hertoseeandwhy?范文:Themostinteresting......
  • C++/嵌入式八股学习-day2
    C++/嵌入式八股学习-day2C/C++手写atoi函数功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。C++有哪几种构造函数ARMARMCPU上的地址转换......
  • 6. 对象解析
    6.对象解析章节目录1.解析总体流程2.类型分辨3.数值解析4.字符串解析5.数组解析6.对象解析‍6.1JSON对象结构JSON对象和数组类似,是一个复合类型,使用{}​包括,数组中每个元素都是一个JSON的value​,而对象中的每一个成员是一个键值对,以冒号':'分隔,......
  • c++中template的用法是什么?
    下文由ChatGPT生成在C++中,template是一种通用编程工具,用于创建通用的函数或类。通过使用模板,可以编写可以应用于不同数据类型的函数或类,从而实现代码的重用性和灵活性。template的使用方法如下:1.函数模板(FunctionTemplates)函数模板允许定义一个通用的函数,可以在不同数据类......
  • JavaSE--多态在开发中的作用
    一、多态在开发中的作用  1、降低程序的耦合度,提高程序的扩展力  publicclassMaster(){    publicvoidfeed(Dogd){}    publicvoidfeed(Dogd){}  }  以上代码中:Master和Dog、Cat关系紧密,耦合度高,导致扩展力很差  publicclassMaster(){   ......