一文解密C++中的多态机制

 更新时间:2023年07月31日 14:07:33   作者:Aomnitrix  
众所周知C++语言的三大特性:封装、多态、继承,其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,下面小编就来带大家深入了解一下C++的多态机制吧

一.多态

1.多态的用处

众所周知C++语言的三大特性:封装、多态、继承。其中多态就是去完成某个行为,但是会根据不同的对象产生不同的状态,所以叫多态。

2.多态的实现

在继承中实现多态还需要两个条件:

1.使用基类的指针或者引用来调用虚函数

2.必须在派生类对虚函数进行重写

代码演示如下:

class A
{
public:
	virtual void func()
	{
		cout << "A::func()" << endl;
	}
};
class B : public A
{
public:
	void func()
	{
		cout << "B::func()" << endl;
	}
};
int main()
{
	B b;
	A& a = b;
	a.func();
	return 0;
}

3.虚函数

用virtual修饰的类成员函数叫做虚函数,虽然与虚拟继承用的是同一关键字但是两者并无关联。

virtual void func(){cout << "A::func()" << endl;}

派生类的重写:

重写需要在派生类中编写与基类相同的虚函数:返回类型相同(协变除外)、函数名相同、参数相同(缺省值可不同),然后函数具体实现的不同,来完成多态。

协变

协变允许基类派生类虚函数的返回值不同,但是要求返回值是互为父/子类的指针或者引用。如下所示:

class A
{
public:
	A(int a = 1)
		:_a(a) {}
	virtual A* func(int val = 0)
	{
		cout << val<< endl;
		return new A;
	}
private:
	int _a;
};
class B : public A
{
public:
	B(int b = 1)
		:_b(b) {}
	virtual B* func(int val = 1)
	{
		cout << val<< endl;
		return new B;
	}
private:
	int _b;
};
int main()
{
	B b;
	A& a = b;
	a.func();
	return 0;
}

上图中,如果返回的不是本身自己父子类的指针/引用,则可以交换顺序!需要注意的是在派生类重写基类的虚函数可以不加virtual

析构函数的重写

如果基类重写的析构函数,在派生类可以不加virtual也可以完成重写(因为编译器将析构函数的名称统一处理成destructor。)

4.override 和 final

这两个关键字都是C++11的新语法,final修饰虚函数 使得虚函数不可以重写

override 可以在派生类函数检查是否重写的基类虚函数,如果没有就 报错

如果不想类被继承可以采用:将构造函数设为私有、将类用final修饰为最终类

5.重载重写与重定义

重载:两个函数在同一作用域、函数名/参数相同

重写:两个函数分别在基类和派生类的作用域、函数名/参数/返回值都必须相同(协变例外)、两个函数必须是虚函数

隐藏(重定义)两个函数分别在基类和派生类的作用域、函数名相同、两个基类和派生类的同名函数不构成重写就是重定义

6.虚函数表

如果在类中定义了虚函数,那么类中就会有个虚表用来存放虚表指针。

虚函数表本质是一个存虚函数指针的指针数组

虚表中存放着虚函数,同类型对象会共用一块虚表。

子类自己的虚函数只会放到第一个父类的虚表后面,其他父类的虚表不需要存储,因为存储了也不能调用

有虚函数的类前4/8字节存储的是虚表的地址。

去虚表找 看是什么对象 (多态时)

虚函数重写只重写函数的实现 缺省值会使用父类的

到此这篇关于一文解密C++中的多态机制的文章就介绍到这了,更多相关C++多态机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Qt开发之CheckBox多选框组件的用法详解

    C++ Qt开发之CheckBox多选框组件的用法详解

    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍CheckBox单行输入框组件的使用方法,需要的朋友可以参考下
    2023-12-12
  • C++OOP对象和类的详细讲解

    C++OOP对象和类的详细讲解

    这篇文章主要介绍了C++面相对象编程中的类与对象的特性与概念,OOP面向对象语言相对C语言这样面相过程的语言来说具有类和对象以及方法这样的特性,需要的朋友可以参考下
    2021-08-08
  • Qt实现指针式时钟 Qt实现动态时钟

    Qt实现指针式时钟 Qt实现动态时钟

    这篇文章主要为大家详细介绍了Qt实现指针式时钟,Qt实现动态时钟,两者相互切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++语言 STL容器list总结

    C++语言 STL容器list总结

    这篇文章主要介绍了C++语言 STL容器list总结的相关资料,需要的朋友可以参考下
    2016-10-10
  • C++编程中的命名空间基本知识讲解

    C++编程中的命名空间基本知识讲解

    这篇文章主要介绍了C++编程中的命名空间基本知识讲解,包括对C++11中内联命名空间新特性的介绍,需要的朋友可以参考下
    2016-01-01
  • Eclipse对printf()不能输出到控制台的快速解决方法

    Eclipse对printf()不能输出到控制台的快速解决方法

    Eclipse对printf()不能输出到控制台的快速解决方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 解析C++编程中如何使用设计模式中的状态模式结构

    解析C++编程中如何使用设计模式中的状态模式结构

    这篇文章主要介绍了如何在C++编程中适用设计模式中的状态模式结构,状态模式强调将特定状态相关的逻辑分散到一些类的状态类中,需要的朋友可以参考下
    2016-03-03
  • C语言实现猜数字小游戏

    C语言实现猜数字小游戏

    这篇文章主要介绍了C语言实现猜数字小游戏,附有详细代码,需要的小伙伴可以参考一下,希望对你的辽西有所帮助
    2021-10-10
  • Qt实现生成指定范围内随机数与随机字符串

    Qt实现生成指定范围内随机数与随机字符串

    这篇文章主要为大家详细介绍了如何利用Qt实现生成指定范围内随机数与随机字符串,文中的示例代码简洁易懂,感兴趣的小伙伴可以自己动手尝试一下
    2023-07-07
  • C++基于socket编程实现聊天室功能

    C++基于socket编程实现聊天室功能

    这篇文章主要介绍了C++基于socket编程实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论