虚基类和虚继承

news/2025/2/8 14:09:09 标签: c++

抽象类(有纯虚函数的类) / 虚基类
virtual:
1.修饰成员方法是虚函数
2.可以修饰继承方式,是虚继承。被虚继承的类,称作虚基类。

vfptr/vbptr
vftable/vbtable

在这里插入图片描述

在Windows vs下会存在内存释放错误的问题,Linux g++下自动修正。

在这里插入图片描述
命令:cl 继承与多态.cpp /d1reportSingleClassLayout 可以查看内存布局。

在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;

class A {
public:
	virtual void func() { cout << "call A::func" << endl; }
	void operator delete(void *ptr) {
		cout << "operator delete p:" << ptr << endl; 
		free(ptr);
	}
		
private:
	int ma;
};

class B : virtual public A {
public:
	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:
	int mb;
};

/*
A a; 4个字节
B b; ma,mb   8个字节+4 = 12个字节  vbptr
*/
int main() {
	基类指针指向派生类对象,永远指向的是派生类基类部分数据的起始地址
	//A *p = new B(); // B::vftable
	//p->func();
	//delete p;

	B b;
	A *p = &b;
	p->func();

	return 0;
}


http://www.niftyadmin.cn/n/5844940.html

相关文章

[MoeCTF 2022]baby_file

题目 <html> <title>Heres a secret. Can you find it?</title> <?phpif(isset($_GET[file])){$file $_GET[file];include($file); }else{highlight_file(__FILE__); } ?> </html> 读取flag /?filephp://filter/readconvert.base64-encode…

对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xff0…

Leetcod59:螺旋矩阵 II

题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 代码思路&#xff1a; 初始化矩阵&#xff1a; 创建一个 n x n 的矩阵 res&#xff0c;初始时所有元素都设为 None…

Android studio 编译速度增加

在gradle.properties增加如下代码&#xff0c;作用看注释 # Gradle 和 Kotlin 支持增量编译&#xff0c;只编译有改动的部分 kotlin.incrementaltrue # Gradle 支持并行构建&#xff0c;充分利用多核 CPU org.gradle.paralleltrue # Gradle 构建缓存可以缓存任务输出&#xff…

Transformer 的辉煌与大模型方向确立,点燃AGI之火把

在人工智能的迅猛发展进程中&#xff0c;大模型已成为推动各领域变革的核心力量&#xff0c;而模型参数规模则是衡量其能力和技术水平的关键指标。从早期的基础模型到如今参数规模令人惊叹的超大型模型&#xff0c;这一发展历程见证了人工智能技术的飞速进步。本文将以 GPT 系列…

UnityShader学习笔记——动态效果

——内容源自唐老狮的shader课程 目录 1.原理 2.Shader中内置的时间变量 3.Shader中经常会改变的数据 4.纹理动画 4.1.背景滚动 4.1.1.补充知识 4.1.2.基本原理 4.2.帧动画 4.2.1.基本原理 5.流动的2D河流 5.1.基本原理 5.2.关键步骤 5.3.补充知识 6.广告牌效果 …

【Android】Android开发应用如何开启任务栏消息通知

Android开发应用如何开启任务栏消息通知 1. 获取通知权限2.编写通知工具类3. 进行任务栏消息通知 1. 获取通知权限 在 AndroidManifest.xml 里加上权限配置&#xff0c;如下。 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android…

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2025年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…