c++249多态

#include<iostream>
using namespace std;
class Parent
{
public:
	Parent(int a)
	{
		this->a = a;
		cout << " Parent" << a << endl;
	}
public:
	virtual void print()//在子类里面可写可不写 
	{
		cout << "Parent" <<a<< endl;
	}
protected:
private:
	int a;
};

class Child:public Parent 
{
public:
	Child(int b):Parent(10)
	{
		this->b = b;
		cout << " Child b" << b << endl;
	}
public:
	void print()
	{
		cout << "Child" <<b<< endl;
	}
protected:
private:
	int b;

};


void main()
{
	//可以把子类的对象赋值给指针
	Parent* base = NULL;
	Parent p1(20);
	Child c1(30);
	base = &p1;
	base->print();//父类
	base = &c1;
	base->print();//执行谁的 ->面向对象新需求



	  
	return;
}

多态如何演变:
在这里插入图片描述

#include<iostream>
using namespace std;

class HeroFighter
{
public:
	virtual int power()
	{
		return 10;
	}
};

class EncmyFighter
{
public:
	int attact()
	{
		return 15;
	}
};

class AdvHeroFighter :public HeroFighter
{
public:
	virtual  int power()
	{
		return 10;
	}
};

//


class AdvAdvHeroFighter :public HeroFighter
{
public:
	virtual int power()
	{
		return 30;
	}
};
void play(HeroFighter *hf, EncmyFighter *ef)
{
	//多态场景
	if (hf->power() > ef->attact())//hf->power() 会有多态发生
	{
		cout << "hero win" << endl;
	}
	else
	{
		cout << "hero faule" << endl;
	}
	
}
void main()
{
	HeroFighter hf;
	EncmyFighter ef;
	AdvHeroFighter advhf;

	//

	AdvAdvHeroFighter advadvhf;

	play(&hf, &ef);
	play(&advhf, &ef);
	//
	play(&advadvhf, &ef);//这个框架能把后来写的代码调用起来

 }
//多态框架
//play 给对象搭建舞台 看成一个框架 
//封装:突破函数 用类做函数参数时候 可以使用对象的属性和对象的方法
//继承: A B代码复用
//多态:可以使用未来  
//实现多态的三个条件:1.要有继承 2.要有函数重写3.父类指针指向子类对象


//void main01()
//{
//	HeroFighter hf;
//	EncmyFighter ef;
//	AdvHeroFighter advhf;
//	if (hf.power() > ef.attact())
//	{
//		cout << "hero win" << endl;
//	}
//	else
//	{
//		cout << "hero faule" << endl;
//	}
//	if (advhf.power() > ef.attact())
//	{
//		cout << "hero win" << endl;
//	}
//	else
//	{
//		cout << "hero faule" << endl;
//	}
//	return;
//}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

虚析构

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class A
{
public:
	A()
	{
		p = new char[20];
		strcpy(p, "obja");
		cout << "a" << endl;
	}
	virtual ~A()
	{
		delete[] p;
		cout << "~a" << endl;
	}

	protected:
	private:
		char* p;
};

class B  :public A
{
public:
	B()
	{
		p = new char[20];
		strcpy(p, "obja");
		cout << "b" << endl;
	}
	~B()
	{
		delete[] p;
		cout << "~b" << endl;
	}

protected:
private:
	char* p;
};
class C :public B
{
public:
	C()
	{
		p = new char[20];
		strcpy(p, "obja");
		cout << "c" << endl;

	}
	~C()
	{
		delete[] p;
		cout << " ~`c" << endl;
	}

protected:
private:
	char* p;
};
//只执行了父类的析构 
//通过父类指针把子类的析构函数都执行一遍
//释放所有的子类资源 只能用virtual
void howtodelete(A *base)
{
	delete base;//不会表现成多态
}

void main()
{
	C* myc = new C;//how delete 匹配  new会自动调用~函数 
	howtodelete(myc);



	return;
}

在这里插入图片描述

在这里插入图片描述

调用a进去 把a的地址赋值给指针

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
1.在这里插入图片描述
1.补充:一个函数在不同类中穿梭(动态)
c++提前vptr指针 找到 虚化列表 找到函数指针进行动态绑定

子类和父类步长:

在这里插入图片描述
步长问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子类跳到下一个单元 父类跳两个元素

子类和父类指针步长不一样
多态时用父类指针指向对象 父类步长加加 是两个概念

#include<iostream>
using namespace std;


//构造函数中调用虚函数能发生多态吗
class Parent
{
public:
	Parent(int a = 0)
	{
		this->a = a;
		print();
	}
	virtual void print()
	{
		cout << "我是爹" << endl;
	}
	virtual void print2()
	{
		cout << "我是爹" << endl;
	}
private:
	int a;
};



class Child:public Parent
{
public:
	/*Child(int a=0,int b = 0):Parent(a)
	{
		this->b = b;
	}*/
	Child(int b = 0) :Parent(0)
	{
		this->b = b;
		print();
	}
	virtual void print()
	{
		cout << "我是son" << endl;
	}
	virtual void print2()
	{
		cout << "我是son" << endl;
	}
private:
	int b;
};

void HowtoPlay(Parent* base)
{
	base->print();//有多态
}




void main()
{
	Child c1;//定义一个子类对象 在这个过程中构造函数调用虚函数print 能发生多态吗

	Parent* pP = NULL;
	Child* pC = NULL;



	Child array[] = { Child(1),Child(2),Child(3) };
   
	pP = array;
	pC = array;
	//访问
	pP->print();
	pC->print();


	pP++;
	pC++;


	pP->print();
	pC->print();
	return;
}

没添加 属性和方法子类和父类指针步长一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

目录 1.创建 添加了Bahdanau的decoder 2. 训练 3.定义评估函数BLEU 4.预测 5.知识点个人理解 1.创建 添加了Bahdanau的decoder import torch from torch import nn import dltools#定义注意力解码器基类 class AttentionDecoder(dltools.Decoder): #继承dltools.Decoder写…

大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)

实验二&#xff1a; Hadoop安装和使用 一、实验目的 实现hadoop的环境搭建和安装Hadoop的简单使用&#xff1b; 二、实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者18.04&#xff09;&#xff1b;Hadoop版本&#xff1a;3.1.3&#xff1b;JDK版本&…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

【靶点Talk】免疫检查点争夺战:TIGIT能否超越PD-1?

曾经的TIGIT靶点顶着“下一个PD-1”的名号横空出世&#xff0c;三年的“征程”中TIGIT走过一次又一次的失败&#xff0c;然而面对质疑和压力仍有一批公司选择前行。今天给大家分享TIGIT靶点的相关内容&#xff0c;更多靶点科普视频请关注义翘神州B站和知乎官方账号。 TIGIT的“…

2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)

网络爬虫概述 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网页蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种自动化程序或脚本&#xff0c;用于浏览万维网&#xff08;World Wide Web&#xf…

串口助手的qt实现思路

要求实现如下功能&#xff1a; 获取串口号&#xff1a; foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {qDebug() << "Port: " << serialPortInfo.portName(); // e.g. "COM1"qDebug() <<…

2024年中国研究生数学建模竞赛C题——解题思路

2024年中国研究生数学建模竞赛C题——解题思路 数据驱动下磁性元件的磁芯损耗建模——解决思路 二、问题描述 为解决磁性元件磁芯材料损耗精确计算问题&#xff0c;通过实测磁性元件在给定工况&#xff08;不同温度、频率、磁通密度&#xff09;下磁芯材料损耗的数据&#xf…

【HTTPS】中间人攻击和证书的验证

中间人攻击 服务器可以创建出一堆公钥和私钥&#xff0c;黑客也可以按照同样的方式&#xff0c;创建一对公钥和私钥&#xff0c;冒充自己是服务器&#xff08;搅屎棍&#xff09; 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的&#xff0c;服务器能生产&…

「iOS」——单例模式

iOS学习 前言单例模式的概念单例模式的优缺点单例模式的两种模式懒汉模式饿汉模式单例模式的写法 总结 前言 在一开始学习OC的时候&#xff0c;我们初步接触过单例模式。在学习定时器与视图移动的控件中&#xff0c;我们初步意识到单例模式的重要性。对于我们需要保持的控件&a…

java基础知识20 Intern方法的作用

一 Intern方法作用 1.1 Intern方法 1.在jdk1.6中&#xff1a; intern()方法&#xff1a;在jdk1.6中&#xff0c;根据字符串对象&#xff0c;检查常量池中是否存在相同字符串对象 如果字符串常量池里面已经包含了等于字符串X的字符串&#xff0c;那么就返回常量池中这个字符…

windows安装docker 本地打包代码

参考文章1&#xff1a;https://gitcode.csdn.net/65ea814b1a836825ed792f4a.html 参考文章2&#xff1a; Windows 安装docker&#xff08;详细图解&#xff09;-CSDN博客 一 下载 Docker Desktop 在官网上下载 Docker Desktop&#xff0c;可以从以下链接下载最新版本&#x…

【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍

最近在整理之前的一些实践工作&#xff0c;一方面是为了笔记记录&#xff0c;另一方面也是自己做一些温故知新&#xff0c;或许对于理解一些现在大模型工作也有助益。 1. 基于bert模型实现中文语句的embedding编码 首先是基于bert模型实现中文语句的embedding编码&#xff0c;…

鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)

#打包成.hap需要用到真机 原因是&#xff1a;只有用上了真机才能在项目中配置 自动签名 #步骤: ##第一步:选择真机->选择项目结构->点Sigining Configs(签名配置) ##第二步:勾选Automatically generate signature(自动签名)->点击ok ##第三步:点击构建->点击 …

接口幂等性和并发安全的区别?

目录标题 幂等性并发安全总结 接口幂等性和并发安全是两个不同的概念&#xff0c;虽然它们在设计API时都很重要&#xff0c;但侧重点不同。 幂等性 定义&#xff1a;幂等性指的是无论对接口进行多少次相同的操作&#xff0c;结果都是一致的。例如&#xff0c;HTTP的PUT和DELE…

QT快速安装使用指南

在Ubuntu 16.04上安装Qt可以通过多种方式进行。以下是使用Qt在线安装程序和apt包管理器的两种常见方法&#xff1a; 方法一&#xff1a;使用Qt在线安装程序 下载Qt在线安装程序 访问Qt官方网站&#xff1a;Try Qt | Develop Applications and Embedded Systems | Qt找到并下载…

Hadoop的安装

文章目录 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。二. 环境变量三. 配置 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。 随后点击下载即可 由于Hadoop不直接支持Windows系统&#xff0c;因此&#xff0c;需要修改一些配置才能运行 二. 环境变量 三. 配置 进…

arcgisPro地理配准

1、添加图像 2、在【影像】选项卡中&#xff0c;点击【地理配准】 3、 点击添加控制点 4、选择影像左上角格点&#xff0c;然后右击填入目标点的投影坐标 5、依次输入四个格角点的坐标 6、点击【变换】按钮&#xff0c;选择【一阶多项式&#xff08;仿射&#xff09;】变换 7…

VisualPromptGFSS

COCO-20 i ^i i太大&#xff0c;不建议复现

大学生必看!60万人在用的GPT4o大学数学智能体有多牛

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1…

14年数据结构

第一题 解析&#xff1a; 求时间复杂度就是看程序执行了多少次。 假设最外层执行了k次&#xff0c;我们看终止条件是kn&#xff0c;则&#xff1a; 有, 内层是一个j1到jn的循环&#xff0c;显然执行了n次。 总的时间复杂度是内层外层 答案选C。 第二题 解析&#xff1a; 一步一…