首页 > 编程语言 >C++:45---多态

C++:45---多态

时间:2022-11-01 14:36:17浏览次数:49  
标签:调用 函数 show 子类 45 多态 --- 父类

一、多态介绍

  • 面向对象的核心思想是多态性,其含义是“多种形式”
  • 概念:在子类覆盖了父类函数的情况下,用父类的指针(或引用)调用子类对象,或者通过父类指针调用覆盖函数的时候(动态绑定),实际上调用的是子类的覆盖版本,这种现象叫做多态
  • 注意事项:
  • 只有用父类的指针(或引用)调用子类对象多态才会产生,非指针/引用不会产生多态
  • 且只有用父类的指针(或引用)调用虚函数才会产生多态,调用非虚函数不会产生多态效果
  • 运行时解析:
  • 当我们使用基类的引用或指针调用基类中定义的一个虚函数时,我们并不知道该函数真正作用的对象是什么类型,因为它可能是一个基类的对象也可能是一个派生类的对象

  • 如果该函数是虚函数,则直到运行时才会决定到底执行哪个版本。非虚函数的调用在编译时进行绑定的,类似的,通过对象进行的函数(虚函数或非虚函数)调用也在编译时绑定

二、多态的条件

  • 父子类之间有覆盖关系
  • 基类必须通过引用或指针指向子类,然后再调用虚函数,此时就可以实现多态

三、演示案例

class A
{
public:
//虚函数
virtual void show()const { cout << "A1 "; }
void show2()const { cout << "A2\n"; }
};
class B :public A
{
public:
//虚函数
void show()const { cout << "B1 "; }
void show2()const { cout << "B2\n"; }
};
void printfShow(A const& data)
{
data.show();
data.show2();
}
int main()
{
A a;
B b;
printfShow(a);
printfShow(b);
return 0;
}

运行结果:


结果分析:

  • ①printfShow(a):因为传入的是A类对象,所以调用的是A类中的show()和show2()方法,这个没什么稀奇的,看下面
  • ②printfShow(b):传入的是B类对象,而B类是A的派生类
  • 所以调用show()时,由于show是虚函数,所以此时对于show的调用取决于引用所指的对象类型(此处为B,所以调用B的show函数,这就是动态绑定与多态的效果)
  • 调用show2()时,因为show2()不是虚函数,所以不会有多态的效果,此时对函数的调用取决于引用的类型(A类型),所以调用A类的show2()方法这个原理就是前面介绍“派生类向基类转换”的文章的知识点. 

四、virtual函数的缺省参数值是静态绑定的

五、多态的实现方式(面试)

  • 1.必须有继承关系
  • 2.父子类之间有重写(覆盖)
  • 3.父类的指针指向于子类,或父类的引用指向于子类
  • 4.通过父类的指针或引用调用成员方法,会实现不同的效果


标签:调用,函数,show,子类,45,多态,---,父类
From: https://blog.51cto.com/u_14934686/5813624

相关文章

  • C++(STL):26 ---关联式容器set用法
    set容器都会自行根据键的大小对存储的键值对进行排序,只不过set容器中各键值对的键key和值value是相等的,根据key排序,也就等价为根据value排序。另外,使用set容器......
  • 怎么查小河流名称--河流数据库
    全国最大的河流名称数据库,没有你找不到的当一条河流自上而下不同河段有不同的名称时,一般以下游的河名作为整个河流的名称。当河流在地形图上没有标注名称时,可采用下列方法......
  • C++(STL):06---数值的极值(numeric_limits类)
    一、数值的极值概述数值类型有着与平台相依的极值C++标准规定了各种类型必须保证的最小精度。这些最小值如下图所示: 类型最小长度char1byte(8bits)shortint2bytesint2bytes......
  • C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则
    一、继承中的构造函数根据构造函数的执行流程我们知道:派生类定义时,先执行基类的构造函数,再执行派生类的构造函数拷贝构造函数与上面是相同的原理二、继承中的析构函数根据析......
  • C++:46---绝不重新定义继承而来的non-virtual函数
    一、看一个隐藏non-virtual函数的例子假设classD以public的方式继承于classB,代码如下:classB{public:voidmf();};classD:publicB{};intmain(){Dx;B*pB=&x;pB->......
  • 动态规划-回文串
    回文串是从左到右和从右到左读起来一样的字符串,变种还有回文子序列,区别就是字符可以不连续。求回文串个数、最长回文串、最长回文序列也是典型的二维动态规划问题。我们......
  • C++(STL):05---智能指针之unique_ptr
    一、unique_ptr类头文件:#include<memory>智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型与shared_ptr的不同之处:shared_ptr所指向的对象可以有多个其他shared_p......
  • C++:31---对象引用和赋值
    一、对象移动概述C++11标准引入了“对象移动”的概念对象移动的特性是:可以移动而非拷贝对象在C++旧标准中,没有直接的方法移动对象。因此会有很多不必要的资源拷贝标准库容器......
  • 记录create-react-app使用craco-fast-refresh热更新插件,报错Uncaught TypeError: Cann
    1.问题背景项目在引用自研组件库后,启动后webpack报错热更新存在问题,无法正常启动2.解决方案在询问组件库开发同事,被告知无问题;百度无果;查找webpack源码后,发现能定位......
  • C++:32---IO库
    一、IO库I0库类型和头文件头文件类型iostreamistream,wistream从流读取数据ostream,wostream向流写入数据iostream,wiostream读写流fstreamifstream,wifstream从文件读取数......