c++249多态

ops/2024/9/24 17:20:21/
#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.ppmy.cn/ops/115372.html

相关文章

oracle生成时间戳字符的两种方法

在Oracle中&#xff0c;生成时间戳字符串可以通过两种方式实现&#xff1a;使用SYSTIMESTAMP函数和使用TO_CHAR函数。 方法一&#xff1a;使用SYSTIMESTAMP函数 SELECT SYSTIMESTAMP FROM DUAL; 方法二&#xff1a;使用TO_CHAR函数 SELECT TO_CHAR(SYSTIMESTAMP, YYYY-MM-D…

jspdf踩坑 htmltocanvas

Maximum call stack size exceeded Occurred while linting D:\project\static\simhei-normal.js:2 at String.match (<anonymous>) at Array.forEach (<anonymous>) at Array.forEach (<anonymous>) 解决方案是换到jspdf.js目录里

【Leetcode152】分割回文串(回溯 | 递归)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 具体例子和步骤&#xff1a;假设 s "aab"&#xff0c;步骤如下&#xff1a; 初始状态&#xff1a; s "aab"path []res [] 第一层递归&#xff08;外层循环&#xff09;&#xff1a; path []检…

Flink 与 Kubernetes (K8s)、YARN 和 Mesos集成对比

Flink 与 Kubernetes (K8s)、YARN 和 Mesos 的紧密集成&#xff0c;是 Flink 能够在不同分布式环境中高效运行的关键特性。 Flink 提供了与这些资源管理系统的深度集成&#xff0c;以便在多种集群管理环境下提交、运行和管理 Flink 作业。Flink 与 K8s、YARN 和 Mesos 集成的详…

Kubernetes调度单位Pod

Kubernetes调度单位Pod 1 Pod简介 不直接操作容器container。 一个 pod 可包含一或多个容器&#xff08;container&#xff09;&#xff0c;它们共享一个 namespace&#xff08;用户&#xff0c;网络&#xff0c;存储等&#xff09;&#xff0c;其中进程之间通过 localhost 本地…

MQ高级(二):死信交换机--延迟消息及DelayExchange插件--超时订单案例实现

目录 1.延迟消息 1.1.死信交换机和延迟消息 1.1.1.死信交换机 1.1.2.延迟消息 1.2.DelayExchange插件 1.2.1.下载 1.2.2.安装 1.2.3.声明延迟交换机 1.2.4.发送延迟消息 1.3.超时订单问题 1.3.1.定义常量 1.3.2.配置MQ 1.3.3.改造下单业务&#xff0c;发送延迟消息…

C++中const(最全详细说明和使用)

在C中&#xff0c;const是一个非常重要的关键字&#xff0c;能够用于定义常量、防止意外修改变量的值以及保证代码的安全性和可读性。它可以用在变量、指针、函数参数和成员函数等多个地方。 我们可以从以下几个方面进行详细说明&#xff1a; 1.常量变量 const关键字可以用来…

电线电缆制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电线电缆制造行业作为关键的基础设施建设领域&#xff0c;正积极拥抱新技术&#xff0c;推动生产方式的深刻变革。电线电缆制造5G智能工厂物联数字孪生平台的兴起&#xff0c;不仅为行业注入了新的活力&#xff0c;更为制造业的数字化转型树立了新的标杆。 电线电缆制造5G智能…