C++学习寄录(九.多态)

1.多态基本概念

先来看这样的代码,我的本意是想要输出“小猫在说话”,但实际输出的却是“动物在说话”。这是因为地址早绑定,在代码编译阶段就已经确定了函数地址;如果想要实现既定目标,那么这个dospeak()函数就不能提前绑定,需要在运行阶段进行绑定,也就是地址晚绑定。

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>

using namespace std;

class animal{
	public:
	void speak(){
		std::cout << "动物在说话" << std::endl;
	}
};

class cat : public animal{
	public:
	void speak(){
		std::cout << "小猫在说话" << std::endl;
	}
};

void dospeak(animal &animal){
	animal.speak();
}


int main(){
	cat cat1;
	dospeak(cat1);


	return 0;
}




输出为

动物在说话

把父类的函数定义为虚函数,这样这个函数的地址就不是早绑定,他需要在代码运行时确定传入的对象,再来确定地址,这样便完成了地址晚绑定。

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>

using namespace std;

class animal{
	public:
	virtual void speak(){
		std::cout << "动物在说话" << std::endl;
	}
};

class cat : public animal{
	public:
	void speak(){
		std::cout << "小猫在说话" << std::endl;
	}
};

void dospeak(animal &animal){
	animal.speak();
}


int main(){
	cat cat1;
	dospeak(cat1);


	return 0;
}




输出为

小猫在说话

这样就叫做多态,多态满足条件

* 有继承关系

* 子类重写父类中的虚函数

多态使用条件

* 父类指针或引用指向子类对象

重写:函数返回值类型 函数名 参数列表 完全一致称为重写

2.纯虚函数和抽象类

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容

因此可以将虚函数改为**纯虚函数**

纯虚函数语法:`virtual 返回值类型 函数名 (参数列表)= 0 ;`

当类中有了纯虚函数,这个类也称为==抽象类==

**抽象类特点**:

* 无法实例化对象

* 子类必须重写抽象类中的纯虚函数,否则也属于抽象类

#include <iostream>
#include <fstream>
#include <string>
#include <chrono>
#include <ctime>
#include <thread>

using namespace std;

class Animal
{
public:
	//纯虚函数
	//类中只要有一个纯虚函数就称为抽象类
	//抽象类无法实例化对象
	//子类必须重写父类中的纯虚函数,否则也属于抽象类
	virtual void func() = 0;
};

class Cat :public Animal
{
public:

	Cat(string name){
		name_t = new string(name);

	}
	virtual void func() 
	{
		cout << *name_t << "小猫在说话" << endl;	   //子类必须重写父类中的纯虚函数,否则也属于抽象类
	};

	string *name_t;
};

int main() {

	Animal *animal = new Cat("Tom");    // 抽象类无法实例化对象
	animal->func();
	delete animal;   //记得销毁

	return 0;
}

输出为

Tom小猫在说话

相关推荐

  1. C++学习.

    2023-12-05 21:26:02       57 阅读
  2. c++详细学习

    2023-12-05 21:26:02       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-05 21:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-05 21:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-05 21:26:02       82 阅读
  4. Python语言-面向对象

    2023-12-05 21:26:02       91 阅读

热门阅读

  1. 复杂sql分析 以及 索引合并

    2023-12-05 21:26:02       46 阅读
  2. bitnami Docker 安装ELK(elasticsearch, logstash, kibana)

    2023-12-05 21:26:02       58 阅读
  3. mysql多版本并发控制mvcc

    2023-12-05 21:26:02       56 阅读
  4. python代码块整行缩进与取消整行缩进快捷键

    2023-12-05 21:26:02       56 阅读
  5. 题目 异常处理

    2023-12-05 21:26:02       53 阅读
  6. day69

    day69

    2023-12-05 21:26:02      49 阅读
  7. 数据产品经理常用的ChatGPT通用提示词模板

    2023-12-05 21:26:02       55 阅读
  8. Ubuntu20.04 Kimera Semantic运行记录

    2023-12-05 21:26:02       61 阅读
  9. 机器学习之决策树及随机森林

    2023-12-05 21:26:02       51 阅读
  10. 修复 Ubuntu 2204 Wi-Fi 热点无法连接问题

    2023-12-05 21:26:02       60 阅读
  11. 决策树详解

    2023-12-05 21:26:02       54 阅读