c++249多态

embedded/2024/9/22 15:03:41/
#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/embedded/115092.html

相关文章

Java面试篇基础部分-ReentrantLock详解

ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。   那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

vscode搭建ros开发环境问题记录(更新...)

文章目录 vscode 不能自动补全方法一&#xff1a;方法二&#xff1a; 开发环境&#xff1a; vmware 15.7 ubuntu 20.04 ros noetic vscode 不能自动补全 方法一&#xff1a; 这里将头文件已经正确包含到c_cpp_properties.json中代码中仍然不能自动补全&#xff0c; 将C_CPP插…

mysql学习教程,从入门到精通,SQL DISTINCT 子句 (16)

1、SQL DISTINCT 子句 SQL 的 DISTINCT 子句是一个强大的工具&#xff0c;用于在查询结果中消除重复的行&#xff0c;只保留唯一的数据记录。当处理数据库中的数据时&#xff0c;经常会遇到同一列或多列中存在重复值的情况。DISTINCT 子句可以帮助我们专注于唯一的值&#xff…

oracle 多表查询

3.6多表查询 当查询的数据并不是来源一个表时&#xff0c;需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段&#xff0c;一次查询出多个表的数据。 3.6.1等值连接 等值连接也称为简单连接(Simple Joins)或者内连接(Inner Join)。通过等号来判断连接条件中的数据…

【数据结构】排序算法---计数排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaGo 结语 1. 定义 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。计数排序不是基于比较的排序算法&#xff0c;其核心在于将输入的数据值转化为键存储在额外开辟的数组…

TryHackMe 第3天 | Pre Security (二)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。上一篇中简短介绍了计算机网络相关的知识&#xff0c;本篇博客将记录 网络协议 部分。 How the web works? DNS in detail DNS (Domain name system&…

Debian 12上安装google chrome

当前系统&#xff1a;Debian 12.7 昨天在Debian 12.7上安装Google Chrome时&#xff0c;可能由于网络原因&#xff0c;导入公钥始终失败。 导致无法正常使用命令#apt install google-chrome-stable来安装google chrome; 解决办法&#xff1a; Step1.下载当前google chrome稳…