C++多态、虚函数与纯虚函数

本文介绍了面向对象编程中的多态性,包括静态多态和动态多态。动态多态主要依赖于虚函数,它允许通过父类指针调用子类的重写函数,实现运行时多态。文章通过代码示例展示了如何创建和使用虚函数,并强调了实现动态多态的条件。此外,还提到了纯虚函数的概念,指出含有纯虚函数的类为抽象类,子类必须实现这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、多态

  在讨论正题前先了解多态概念。封装、继承、多态是面向对象的三大特性,多态分为两类:

  • 静态多态:函数重载和运算符重载属于静态多态,是一种编译时(compile-time)多态,即编译器在编译时就知道调用的是哪一个函数。
  • 动态多态:派生类和虚函数实现运行时多态(我们一般说的多态是指动态多态,下文简称多态)。

  下面通过一段代码认识一下多态及其基本语法:

class Animal //父类
{ 
public:
	void speak() { 
		cout << "Animal is speaking" << endl;
	}
	virtual void run() {
		cout << "Animal is runing" << endl;
	}
};
class Cat : public Animal  //派生类
{
	void speak() {
		cout << "Cat is speaking" << endl;
	}
	
	void run() {
		cout << "Cat is runing" << endl;
	}
};
int main() 
{
	Animal* ani = new Cat(); //父类指针指向子类对象
	ani->speak(); //Animal is speaking
	ani->run(); //Cat is speaking
	return 0;
}

动态多态满足条件:

  • 有继承关系
  • 子类重写父类的虚函数

动态多态使用条件:

  • 通过父类的指针或引用调用重写的函数。

2、虚函数

  虚函数就是有virtual关键字修饰的成员函数,就是虚函数。虚函数的目的是为了实现多态。
  下面将详细地介绍一下虚函数的实现。如果父类中的函数加了关键字virtual修饰,那么子类中重写的该函数即使不加virtual关键字也会默认是虚函数。如果对一下代码不懂,推荐看我的另一篇博客C++类的布局

#include<iostream>
using namespace std;
class A {
	void fun(){}
};
class B {
	virtual void fun() {}
};
int main() {
	cout << sizeof(A) << endl; //1
	cout << sizeof(B) << endl; //8
	return 0;
}

3、纯虚函数

  下面时其语法。有纯虚函数的类时抽象类,子类必须实现抽象类的纯虚函数,否则也会被视作纯虚函数。

class Animal {
public:
	virtual void functionName() = 0;
};

4、关于进一步理解多态与虚函数,请参考博客:C++类的内存结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值