C++ 多态

目录

多态概念

编译时多态(静态多态)

运行时多态(动态多态)

多态实现

        条件

        虚函数

        虚函数的覆写

 协变

 析构函数的重写

 override与final的关键字

重载(Overloading)

重写(Overriding,覆盖)

隐藏(Hiding)

纯虚函数与抽象类

 多态的原理

        虚函数表指针

         注意:

​编辑         多态的原理

        动态绑定与静态绑定

虚函数表


多态概念

        多态性是面向对象编程中的一个核心概念,它允许对象通过统一的接口表现出不同的行为。多态性增强了程序的灵活性和可扩展性。

编译时多态(静态多态)

        编译时多态,也称为静态多态或早绑定(early binding),是在编译阶段确定调用哪个函数或方法。这主要通过函数重载和模板来实现。

  • 函数重载:允许在同一个作用域内定义多个同名函数,但这些函数的参数类型或参数个数必须不同。编译器在编译时根据函数调用时提供的参数类型和数量来确定调用哪个版本的函数。

  • 模板:允许程序员编写与类型无关的代码。模板函数或模板类在编译时被实例化,编译器根据提供的类型参数生成具体的函数或类实现。

运行时多态(动态多态)

        运行时多态,也称为动态绑定(dynamic binding)或晚绑定(late binding),是在运行时确定调用哪个函数或方法。这主要通过继承和虚函数来实现。

  • 继承:允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。子类可以重写基类中的虚函数,从而在运行时表现出不同的行为

  • 虚函数:在基类中声明为virtual的成员函数。当通过基类指针或引用调用虚函数时,如果指针或引用实际上指向的是派生类对象,那么将调用派生类中重写的虚函数版本。这种机制允许在运行时根据对象的实际类型来确定调用哪个版本的函数。

多态实现

       多态需要继承关系,在继承关系下调用同一函数产生不同行为。

class A
{
public:
	virtual void P(int a = 0)
	{
		cout << a << "A" << endl;
	}
};

class B :public A
{
public:
	virtual void P(int a = 1)
	{
		cout << a <<"B" << endl;
	}
};

void C(A* it)
{
	it->P();
}

int main()
{
	A a;
	B b;
	C(&a);
	C(&b);
	return 0;
}

        条件

  • 必须是基类的指针或者引用来调用虚函数
  • 被调用的必须是虚函数且完成了虚函数的重写与覆盖

        如上文给出的对A的virtual void P()是虚函数而且完成了覆写  

        虚函数

虚函数就是在类成员函数前加virtua修饰(非成员函数不可以加virtual)

class A
{
public:
	virtual void P(int a = 0)
	{
		cout << a << "A" << endl;
	}
};

class B :public A
{
public:
	virtual void P(int a = 1)
	{
		cout << a <<"B" << endl;
	}
};

        虚函数的覆写

虚函数的覆写需要满足

  • 派生类和基类拥有完全相同的虚函数(返回值 参数名 参数列表)

但是注意

  • 派生类继承基类的虚函数时,你参数列表是完全继承基类的(就括号里面的玩意,就是基类里面是 int i = 10,你派生类里面即使int i = 5也会继承成int i = 10)

还有就是 派生类没有virtual不影响派生类的虚函数,但是基类必须有

 

class A
{
public:
	virtual void P(int a = 0)
	{
		cout << a << "A" << endl;
	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值