第三章、多态性

本文介绍了C++中的多态性,包括编译时和运行时的多态性实现。重点讲解了虚函数的概念和作用,阐述了虚函数如何实现动态绑定,以及虚析构函数的必要性。同时,讨论了纯虚函数和抽象类,指出抽象类无法实例化且至少包含一个纯虚函数。最后,对比了静态联编和动态联编的区别。

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

第三章、多态性

1.1、虚函数

一、多态性
  • 同一消息发给不同对象执行不同操作
  • 在c++中,多态性表现形式之⼀是:具有不同功能的函数⽤同⼀个函数名,这样就可以⽤⼀个函数名调⽤不同内容的函数
  • C++中的多态性分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模板体现的,其实现机制称为静态绑定;运行时的多态性是通过虚函数体现的,其实现机制称为动态绑定。
二、虚函数
1、虚函数

虚函数的作⽤是允许在派⽣类中重新定义与基类同名的函数,并且可以通过基类指针或引⽤来访问基类和派⽣类中的同名函数

virtual 函数类型 函数名(形参表){
	函数体;
}
  • 只有类的成员函数才能声明为虚函数
  • 虚函数不能是静态成员函数,也不能是友元函数
  • 若在基类中定义虚函数,在派生类中还需重新定义
  • 构造函数不能是虚函数,析构函数可以是虚函数
  • 在基类中⽤virtual声明成员函数为虚函数。在类外 定义虚函数时,不必再加virtual
2、虚析构函数

定义基类的析构函数是虚析构函数,当程序运行结束时,通过基类指针删除派生类对象时,先调用派生类析构函数,然后调用基类析构函数

class A{
public:
	~A(){
		cout<<"A::~A() is called."<<endl;
	}
	A(){
		cout<<"A::A() is called."<<endl;
	}
}
class B:public A{
private:
	int *ip;
public:
	B(int size=0){
		ip=new int[size];
		cout<<"B::B() is called."<<endl;
	}
	~B(){
		cout<<"B::~B() is called."<<endl;
		delete []ip;
	}
};
int main(){
	A *b=new B(10);
	delete b;
	return 0;
}
输出:
A::A() is called.
B::B() is called.
A::~A() is called.

如果A的析构函数为:
virtual ~A(){
		cout<<"A::~A() is called."<<endl;
}
则输出为:
A::A() is called.
B::B() is called.
B::~B() is called.
A::~A() is called.

1.2纯虚函数和抽象类

一、纯虚函数
1、定义
virtual 函数类型 函数名 (参数表)=0;
2、特点
  • 纯虚函数没有函数体
  • 最后⾯的 =o并不表示函数返回值为o,它只是起形式 上的作⽤,通知编泽系统:在这⾥声明⼀个虚函 数,留待派⽣类中定义
二、抽象类
1、定义

类中至少含有一个纯虚函数

2、特点

抽象类⽆法建⽴对象

1.3静态联编和动态联编

一、静态联编

程序运行之前,在编译阶段就已经确定下来到底要使用哪个函数

二、动态联编

在程序运行时确定对象所调用的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值