当前位置: 首页 > news >正文

C++虚函数与抽象类

一、虚函数

      &nbsp**;类中定义不同类中的同名函数的多态的行为**,主要是通过虚函数来实现。
       在类的成员函数前加virtual关键字。虚函数是实现包含多态的基础。这里需要说明的是当基类里有虚函数且派生类中重新声明了和基类虚函数相同的函数,那么派生类该函数也是虚函数,这个过程称为对基类虚函数进行重写,这对于实现包含多态有重要意义。

【包含多态的条件】
       基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。通过基类对象的指针或者引用调用虚函数

示例:

#include <iostream>
using namespace std;

const double PI = 3.14159;

class cpoint
{
public:
	cpoint(double a, double b)
	{
		x = a;
		y = b;
	}
	virtual double area()
	{
		return 0;
	}

private:
	double x, y;
};

class ccircle :public cpoint  // 圆类 继承cpoint
{
public:
	ccircle(double a, double b, double c) :cpoint(a, b)
	{
		r = c;
	}
	double area()
	{
		return PI * r * r;
	}
private:
	double r;
};

class cractangle :public cpoint // 矩形类 继承cpoint
{
public:
	cractangle(double a, double b, double c, double d) :cpoint(a, b)
	{
		w = c;
		h = d;
	}
private:
	double w, h;
};

void Funcarea(cpoint &p)
{
	cout << "area=" << p.area() << endl;
}

int main()
{
	ccircle cobj(5.5, 6.6, 10);
	Funcarea(cobj);

	cractangle cobjc(3, 4, 5, 6);
	Funcarea(cobjc);

	return 0;
}

二、抽象类

       纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要给出各自的定义。纯虚函数的声明格式为:
       

virtual 函数类型 函数名 (参数表) = 0;

       而抽象类就是指带有纯虚函数的类。

示例:

#include <iostream>
#include <string>
using namespace std;

class CAnimal  // 抽象类
{
public:
	virtual void CallFunc()=0;  // 纯虚函数

private:
	string name;
};

class CCattle :public CAnimal  // 派生出牛类
{
public:
	virtual void CallFunc();

private:
	int age;
};

class CDog :public CAnimal  // 派生出狗类
{
public:
	virtual void CallFunc();

private:
	int age;
};

void CallFunc(CAnimal &sp)  // 通过传递不同的对象实参,可以调用产生对应的成员函数,以实现多态功能
{
	sp.CallFunc();
}

void CCattle::CallFunc() {
	cout << "哞哞叫......哞哞叫" << endl;
}
void CDog::CallFunc() {
	cout << "汪汪汪叫......汪汪汪叫" << endl;
}

int main()
{
	CCattle cobj;
	CallFunc(cobj);

	CDog dobj;
	CallFunc(dobj);

	return 0;
}
http://www.dtcms.com/a/106782.html

相关文章:

  • 使用 libevent 处理 TCP 粘包问题(基于 Content-Length 或双 \r\n)
  • 操作系统高频(七)虚拟地址与页表
  • ADASH VA5 Pro中的route功能
  • electron 的 appData 和 userData 有什么区别
  • SPI高级特性分析
  • JavaScript instanceof 运算符全解析
  • 「DeepSeek-V3 技术解析」:无辅助损失函数的负载均衡
  • 双模多态驱动:DeepSeek-V3-0324与DeepSeek-R1医疗领域应用比较分析与混合应用讨论
  • 移动通信网络中漫游机制深度解析:归属网络与拜访网络的协同逻辑
  • PHP的相关配置和优化
  • openstack 查看所有项目配额的命令
  • SU CTF 2025 web 复现
  • tcp的粘包拆包问题,如何解决?
  • 【深度学习量化交易21】行情数据获取方式比测(2)——基于miniQMT的量化交易回测系统开发实记
  • 常见电源模块设计
  • ColPali:基于视觉语言模型的高效文档检索
  • 探索鸿蒙操作系统:迎接万物互联新时代
  • 【IOS webview】源代码映射错误,页面卡住不动
  • STM32单片机入门学习——第7节: [3-3] GPIO输入
  • 树莓派超全系列教程文档--(22)使用外部存储设备的相关操作
  • Spring Boot 集成Redis中 RedisTemplate 及相关操作接口对比与方法说明
  • #Linux内存管理# 假设设备上安装了一块2G的物理内存,在系统启动时,ARM Linux内核是如何映射的?
  • RAG 和 RAGFlow 学习笔记
  • 【VUE3】Pinia
  • ARM 性能分析工具:Streamline
  • 高并发内存池(二):Central Cache的实现
  • Java 进化之路:从 Java 8 到 Java 21 的重要新特性
  • 【爬虫基础】第三部分 爬虫请求库 1/4
  • Android 防抖和节流
  • 【Kafka基础】Kafka工作原理解析