C++ :多态(类型转换及问题、虚函数、C++如何实现动态绑定、多态成立的条件、抽象基类和纯虚函数、虚析构函数)

本文详细介绍了C++中的多态,包括类型转换问题、动态绑定的实现、多态成立的条件、抽象基类与纯虚函数的作用,以及虚析构函数的重要性。通过虚函数,C++实现了运行时多态,解决了早绑定导致的问题。文章还阐述了虚函数表和vptr在动态绑定中的作用。
摘要由CSDN通过智能技术生成

多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。


目录

一、类型转换及问题

1.2 问题解决思路

1.3 问题解决方案(虚函数,vitual function)

二、C++如何实现动态绑定

三、多态成立的条件

四、抽象基类和纯虚函数(pure virtual function)

五、虚析构函数


 

c++支持编译时多态(静态多态)运行时多态(动态多态)运算符重载和函数重载就是编译时多态派生类和虚函数实现运行时多态

静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定的。而如果函数的调用地址不能编译不能在编译期间确定,而需要在运行时才能决定,这这就属于晚绑定(动态多态,运行时多态)。

 

一、类型转换及问题

1.1

对象可以作为自己的类或者作为它的基类的对象来使用。还能通过基类的地址来操作它。取一个对象的地址(指针或引用),并将其作为基类的地址来处理,这种称为向上类型转换。

也就是说:父类引用或指针可以指向子类对象,通过父类指针或引用来操作子类对象。

class Animal{
public:
	void speak(){
	cout << "动物在唱歌..." << endl;
	}
};

class Dog : public Animal{
public:
	void speak(){
	cout << "小狗在唱歌..." << endl;
	}
};

void DoBussiness(Animal& animal){
	animal.speak();
}

void test(){
	Dog dog;
	DoBussiness(dog);
}
  • 运行结果: 动物在唱歌
  • 问题抛出: 我们给DoBussiness传入的对象是dog,而不是animal对象,输出的结果应该是  小狗在唱歌。

 

1.2 问题解决思路

解决这个问题,我们需要了解下绑定(捆绑,binding)概念。

  • 把函数体与函数调用相联系称为绑定(捆绑,binding)

当绑定在程序运行之前(由编译器和连接器)完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值