03继承与多态续

1、虚基类与虚继承

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


class A
{
public:virtual void func(){cout << "call A ::func()" << endl;}void operator delete(void* ptr){cout << "operator delete ptr " << ptr << endl;free(ptr);}
private:int ma;};class B :virtual public A
{
public:virtual void func(){cout << "call B ::func()" << endl;}void* operator new(size_t size){void* p = malloc(size);cout << "operator new p:" << p << endl;return p;}
private:
private:int mb;
};/*
A a;4
B b:8;ma,mb;
*/int main()
{//基类指针指向的派生类对象,永远指向派生类的地址B b;A* p = &b; //栈上自己会析构//A* p = new B();cout << "mian p :" << p << endl;p->func();//delete p;return 0;/*vbptr*p 释放了从这边开始 释放出错vfptr*/
}

2、菱形继承的问题

在这里插入图片描述
解决方法:虚继承
在这里插入图片描述
虚继承之后报错:
严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息
错误 C2512 “A::A”: 没有合适的默认构造函数可用 Primer_cpp5 P:\qiniu_basic_learn\first_parase\Primer_cpp5\test.cpp 678
因为ma靠近d了,需要d自己初始化
代码:


/*多重继承
菱形继承的问题*/class A
{
public:A(int data) :ma(data) { cout << "A()" << endl; }~A() { cout << "~A()" << endl; }
protected:int ma;
};class B : virtual public  A
{
public:B(int data) :A(data), mb(data) { cout << "B()" << endl; }~B() { cout << "~B()" << endl; }protected:int mb;
};class C :virtual public A
{
public:C(int data) :A(data), mc(data) { cout << "C()" << endl; }~C() { cout << "~C()" << endl; }protected:int mc;
};class D :public B, public C
{
public:D(int data) :A(data), B(data), C(data), md(data) { cout << "D()" << endl; }~D() { cout << "~D()" << endl; }
protected:int md;
};
int main()
{D d(10);return 0;
}

3、四种类型的转换

class Base
{
public:virtual void func() = 0;
};class Derive1 :public Base
{
public:void func() { cout << "call Dervivel::func" << endl; }
};class Derive2 :public Base
{
public:void func() { cout << "call Derive2::func" << endl; }//sDerive2实现新功能的API接口函数void derive02func(){cout << "call Derive2::derive02func" << endl;}
};void showFunc(Base* p)
{//dynamic_cast会检查p是否指向的是一个Derive2类型的对象//p->vfptr->vftable  RTTI信息 如果是,dynamic_cast转型成功//返回Derive2对象的地址,给p2,否则返回nullptrDerive2* p2 = dynamic_cast<Derive2*>(p);if (p2 != nullptr){p2->derive02func();}else{p->func(); //动态绑定  *p的类型 Derive2 derive02func}
}
int main()
{Derive1 d1;Derive2 d2;showFunc(&d1);showFunc(&d2);//const int a = 10;//int* p1 = (int*)&a;//int* p2 = const_cast<int*>(&a);//cout << *p2 << endl;//int b = const_cast<int>(a); 不支持必须是指针或者引用类型//int& b = const_cast<int&>(a);//cout << b << en dl;/*int a = 95;char b = static_cast<int>(a);cout << b << endl;*///基类 《=》派生类 能不能用static_cast//int* p = nullptr;//double* b = (double*)p;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识sql注入--手工注入

目录 可能使用的sql函数 入侵网站方式 1、文件上传漏洞 2、rce 3、sql注入 SQL注入 什么是sql注入 进行SQL注入 实验环境 开始实验&#xff08;使用information_shema数据库&#xff09; 1、进入靶场 2、报列数 下面来解释一下为什么要照上面SQL语句写 url编码 单…

面试中算法(金矿)

有一位国王拥有5座金矿&#xff0c;每座金矿的黄金储量不同&#xff0c;需要参与挖掘的工人人数也不同。 例如&#xff0c;有的金矿储量是5ookg黄金&#xff0c;需要5个工人来挖掘;有的金矿储量是2ookg黄金&#xff0c;需要3个工人来挖掘...... 如果参与挖矿的工人的总数是10。…

探索人类意识的多样性:从安全感到语感、节奏感的差异

在我们的日常生活中&#xff0c;人类意识表现出多种多样的特点&#xff0c;这些特点往往与个体的天生禀赋和生活经历密切相关。从安全感到语感、节奏感&#xff0c;每个人的表现都有所不同。今天&#xff0c;让我们一起来探索这些差异&#xff0c;感受人类意识的多样性。 首先&…

Excel办公技巧之下拉菜单

在日常办工中&#xff0c;经常需在单元格中输入特定的值&#xff0c;此时我们可以使用下拉菜单解决&#xff0c;输入错误和错误值&#xff0c;可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时&#xff0c;它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

资产公物仓管理系统|实现国有资产智能化管理

1、项目背景 资产公物仓管理系统&#xff08;智仓库DW-S201&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 项目设计原则 方案对公物仓资…

HTML标签快速入门

文章目录 一、HTML语法规范1.1 基本语法概述1.2 标签关系 二、HTML基本结构标签2.1 第一个HTML网页2.2 基本结构标签总结 三、网页开发工具3.1 文档类型声明标签3.2 lang 语言种类3.3 字符集3.4 总结 四、HTML常用标签4.1 标签语义4.2 标题标签\<h1> - \<h6>&#…

使用 Spring Boot 配合策略模式增强系统接口扩展能力

使用 Spring Boot 配合策略模式增强系统接口扩展能力 在软件开发中&#xff0c;系统的可扩展性是一个至关重要的方面。而策略模式是一种常见的设计模式&#xff0c;它可以帮助我们实现灵活的算法选择和系统功能扩展。结合 Spring Boot 框架&#xff0c;我们可以更加方便地利用策…

Docker安装教程使用

一、Docker简介 什么是docker&#xff1a; docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上, 也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口什…

c++ 入门2

目录 五. 函数重载 1、参数类型不同 2、参数个数不同 3、参数类型顺序不同 C支持函数重载的原理--名字修饰(name Mangling&#xff09; 为什么C支持函数重载&#xff0c;而C语言不支持函数重载呢&#xff1f; 六. 引用 6.1 概念 6.2 引用特性 6.3 常引用 6.4 使用场景 …

Ps各种修改文字超实用方法

介绍 在日常生活中,难免会遇到进行文字修改的ps场景,此时就需要用到比较专业的ps进行文字修改,博主特意整合了多种情况下的文字p图方法进行记录,但是不包含全部情况,只记录日常中常见的情况,也可以解决大部分场景了 原图有可用文字素材 在p图时,我们可以先观察我们要p的图中…

C++:虚函数表Hook

Hook 在计算机编程中&#xff0c;"Hook"&#xff08;钩子&#xff09;是一种技术&#xff0c;用于拦截并修改特定事件或函数的执行流程。它允许程序员在特定的代码点插入自定义的代码&#xff0c;以实现对程序行为的修改、监视或增强。 虚函数表Hook 虚函数表&#…

哈夫曼编码(上)

文章目录 问题引入哈夫曼编码的编写总述步骤一步骤二步骤三步骤四 实现代码如下 问题引入 哈夫曼编码通常用于通信领域&#xff0c;是对较长信息进行压缩&#xff0c;然后发送到指定的位置&#xff0c;是为了节省发送信息占用的空间。 通常来说&#xff0c;如果信息中字符的重…