虚函数与多态

虚函数

  • 前有 virtual 关键字的成员函数
class base{
	virtual int get();
}
int base::get{}
  • virtual关键字只用在类的定义里的函数声明
  • 构造函数与静态成员函数不能是虚函数

多态

表现形式 一

  • 派生类的指针可以赋给基类的指针
  • 通过基类指针调用基类和派生类中的同名虚函数
    • 指向基类的对象,调用基类的虚函数
    • 指向派生类,调用派生类的虚函数

表现形式 二

  • 派生类的指针可以赋给基类引用

  • 通过基类引用调用基类和派生类中的同名虚函数

    • 引用的是基类的对象,调用基类的虚函数
    • 引用的是派生类对象,调用派生类的虚函数
  • 在非构造函数和非析构函数的成员函数中调用虚函数,就是多态

  • 在构造函数与析构函数中调用虚函数,在编译时即可确定,调用的函数时自己的类或基类中定义的函数

多态的实现

依靠动态联编

虚函数表

  • 每一个有虚函数的类都有虚函数表,该类的任何对象中都放着虚函数表的指针。
  • 4个字节

虚析构函数,纯虚函数和抽象类

虚析构函数

  • 把基类的析构函数声明为virtual
  • 通过基类的指针删除派生类的对象时,首先调用派生类的析构函数,然后调用基类的析构函数
    ![[Pasted image 20231227154139.png]]
    ![[Pasted image 20231227154156.png]]

纯虚函数和抽象类

纯虚函数:没有函数体的虚函数

class A{
	private: int a;
	public:
		virtual void Print()=0; //纯虚函数
		void fun(){cont<<"fun";}
}

抽象类:包含纯虚函数的类

  • 只能作为基类来派生新类使用,不能创建派生类的对象
  • 抽象类的指针和引用可以指向由抽象类派生出来的类的对象
    • A * pa;
  • 抽象类的成员函数内可以调用纯虚函数(不包括构造函数或析构函数)
  • 如果一个类从抽象类派生而来,那么当且仅当他实现了基类中所有的纯虚函数,他才能成为非抽象类
posted @   study_all_day  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示