c++249多态

news/2024/12/22 23:59:49/
#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/news/1528689.html

相关文章

Java 线程之间如何通信?

Java 线程之间如何通信? 文章目录 Java 线程之间如何通信?1. 共享内存2. 消息传递3. 并发库中的工具类4. 线程池中的任务提交与结果获取5. 内存一致性6. Java 8 引入的并行流在 Java 中,线程之间的通信是并发编程中的一个重要问题。线程之间的通信主要有两种方式:共享内存和…

代码随想录Day 51|题目:99.岛屿数量、100.岛屿的最大面积

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目一&#xff1a;99. 岛屿数量思路深度优先搜索DFS广度优先搜索BFS 题目二&#xff1a;100. 岛屿的最大面积DFSBFS 总结 题目一&#xff1a;99. 岛屿数量 99. 岛屿数量 (kamacoder.com) 思路 …

vcs/verdi常用命令(持续更新)

1. 操作rtl 1.1 加载rtl命令 verdi -dbdir simv.daidir的目录 1.2 显示某时刻rtl的值 首先鼠标左键在波形上选中某个特定时刻&#xff0c;然后鼠标选中rtl代码文件&#xff0c;按x就会显示&#xff0c;再按x就会退出显示。 1.3 查找字符串 按/ 1.4 vcs将rtl的信号加载到…

算法-Init

&#xff08;1&#xff09;有限性&#xff08;Finiteness&#xff09;&#xff1a;算法必 需在有限步骤内结束&#xff1b; &#xff08;2&#xff09;确定性&#xff08;Definiteness&#xff09;&#xff1a;算法的每一个步骤必须清晰无歧义地定义&#xff1b; &#xff08;3…

【GeekBand】C++设计模式笔记4_Strategy_策略模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”&#xff0c;“组件协作”模式通过晚期绑定&#xff0c;来实现框架与应用程序之间的松耦合&#xff0c;是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

简单多状态dp第二弹 leetcode -删除并获得点数 -粉刷房子

740. 删除并获得点数 删除并获得点数 分析: 使用动态规划解决 这道题依旧是 打家劫舍I 问题的变型。 我们注意到题目描述&#xff0c;选择 x 数字的时候&#xff0c; x - 1 与 x 1 是不能被选择的。像不像 打家劫舍 问题中&#xff0c;选择 i 位置的金额之后&#xff0c;就不…

iOS - TestFlight使用

做的项目需要给外部人员演示&#xff0c;但是不方便获取对方设备的UDID&#xff0c;于是采用TestFlight 的方式邀请外部测试人员的方式给对方安装测试App&#xff0c;如果方便获取对方设备的UDID&#xff0c;可以使用蒲公英 1.在Xcode中Archive完成后上传App Store Connect之前…

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…