C++多态性、虚函数、纯虚函数和抽象类知识网络构造

简介: C++多态性、虚函数、纯虚函数和抽象类知识网络构造

多态性、虚函数、纯虚函数和抽象类知识网络构造

请针对多态性、虚函数、纯虚函数和抽象类几个重要知识点,给出你的理解和分析,尽可能条理清晰、全面,分层次、逐条列出。
友情提醒:不要摘抄或者抄袭,用自己的语言组织,构建自己的逻辑体系。


**理解思路:

**多态性其实也就是作用域不同的重载,他们之间的作用范围不一样,那什么又是作于范围不一样?在这里就引出了子类,

父类这样的概念,然而对于同名的函数,我们又要怎么定义?这就又引出来虚函数,虚函数的话就是会形成虚函数表,当

子类出现下一个相同的函数名时就会把相应的虚函数给覆盖掉,所以我们来想,什么函数没有虚函数,答案就是构造函数

,当你的子类创造时他会直接直接调用,这不虚函数就没有意义了,但是析构函数确可以写做虚函数但一般是当他是基类

的时候,才把构造写成虚函数。同样的还有内联函数(静态的嘛),和静态函数(同享共享)。那我们又有问题啦,如果

两个类是平行的关系怎么办?这是又引出了纯虚函数,他的话就是在父类那里加个=0;就好啦。这样我们就可以用两个平

行子类来实现同名的虚函数。但是我们在这里的时候要注意,我们不可以去给纯虚构函数加对象,也就有了这一个特殊的

类,抽象类。拥有纯虚构函数的类都是抽象类。**


注意事项:

多态性:

(1)其实就是同名函数的作用范围和指向

他的话其实在我看和重载没有什么区别,唯一的不同可能就是他们的作用域不同,我们回忆一下,重载之后是不是所有情况下都可以用,这个所有情况就是他的作用域。多态是什么?是父类一层一层继承下来的,比如说

#include <iostream>
using namespace std;
class 爷爷//定义形状类
{
public:
  virtual void name(){ cout << "我是爷爷"; };
};
class 爸爸 :public 爷爷
{
  void name(){ cout << "我是爸爸"; };
};
class 崽崽 :public 爸爸
{
  void name(){ cout << "我是崽崽"; };
};

虚函数:(具体看上面的代码)

(1)注意虚函数的覆盖性

(2)构造函数和友元不可以声明为虚函数


纯虚函数:

(1)注意是“有”纯虚函数的类是抽象类,不可以生成对象,只可以派生,由他派生的类的纯虚函数没有重写的话派生类还是一个抽象类

看完上面的理解思路,你就会知道,崽崽1,和崽崽2两个就是所谓的平行关系

#include <iostream>
using namespace std;
class 爸爸//纯虚函数
{
public:
  virtual void name()= 0;
};
class 崽崽1 :public 爸爸//和崽崽2是平行关系
{
  void name(){ cout << "我是崽崽1号"<<endl; };
};
class 崽崽2 :public 爸爸//和崽崽1是平行关系
{
  void name(){ cout << "我是崽崽2号"<<endl; };
};
void display(爸爸 &a)//用于输出
{
  a.name();
}

抽象类:

(1)抽象类不能被实例化,实例化由它的子类来完成,用的话也一般是引用

(2)抽象方法必须由子类来进行重写


案例

1)声明一个Shape抽象类,在此基础上派生出Rectangle(矩形)和Circle(圆)类;

2)二者都有GetArea( )函数计算对象的面积,GetPerim( )函数计算对象的周长。

#include <iostream>
using namespace std;
#define PI 3.14
class Shape//定义形状类
{
public:
  virtual void GetArea() = 0;//纯虚函数
  virtual void GetPerim() = 0;//纯虚函数
};
class Rectangle :public Shape//矩形类
{
public:
  Rectangle(float a, float b){ c = a; k = b; };//矩形的析构函数
  void GetArea(){mj = c*k; cout << "长:"<<c<<endl<<"宽:"<<k<<endl<<"面积是:" << mj << endl;}//定义矩形面积
  void GetPerim(){ zc = 2 * c + 2 * k; cout << "周长是:" << zc<< endl; };//定义矩形周长
private://数据
  float c;
  float k;
  float mj;
  float zc;
};
class Circle :public Shape//
{
public:
  Circle(float a) :r(a){};//圆的析构函数
  void GetArea(){ mj = PI*r*r;  cout << "半径:" << r << endl << "面积是:" << mj << endl; };//定义圆面积
  void GetPerim(){ zc = 2 * PI*r; cout << "周长是:" << zc << endl; };//定义圆周长
private://数据
  float r;
  float mj;
  float zc;
};
void display(Shape &a)
{
  a.GetArea();
  a.GetPerim();
}
int main()
{
  Rectangle m(2,4);
  cout << "矩形类:" << endl ;
  display(m);
  cout << endl << endl;
  Circle n(4);
  cout << "圆类:" << endl;
  display(n);
  cout << endl << endl;
}

**

相关文章
|
C++
C++一分钟之-虚函数与抽象类
【6月更文挑战第21天】在C++中,虚函数与抽象类是多态的基础,增进类间耦合与灵活性。虚函数实现动态绑定,抽象类定义不可实例化的接口。关键点包括:记得使用`virtual`,避免滥用虚函数,确保派生类实现纯虚函数。抽象类不能直接实例化,派生类必须实现所有纯虚函数。通过实例代码学习和实践,能更好地掌握这些概念以优化代码设计。
235 2
|
11月前
|
存储 编译器 C++
【c++】多态(多态的概念及实现、虚函数重写、纯虚函数和抽象类、虚函数表、多态的实现过程)
本文介绍了面向对象编程中的多态特性,涵盖其概念、实现条件及原理。多态指“一个接口,多种实现”,通过基类指针或引用来调用不同派生类的重写虚函数,实现运行时多态。文中详细解释了虚函数、虚函数表(vtable)、纯虚函数与抽象类的概念,并通过代码示例展示了多态的具体应用。此外,还讨论了动态绑定和静态绑定的区别,帮助读者深入理解多态机制。最后总结了多态在编程中的重要性和应用场景。 文章结构清晰,从基础到深入,适合初学者和有一定基础的开发者学习。如果你觉得内容有帮助,请点赞支持。 ❤❤❤
1331 0
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
293 4
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
259 3
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
311 3
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
247 2
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
987 2
|
编译器 C++ 索引
C++虚拟成员-虚函数
C++虚拟成员-虚函数
|
存储 安全 Linux
网络请求的高效处理:C++ libmicrohttpd库详解
网络请求的高效处理:C++ libmicrohttpd库详解
|
12月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。