C++虚函数与多继承
虚函数
C++用虚函数实现运行时多态,虚函数的实现是由两个部分组成的,虚函数指针与虚函数表。
虚函数指针(vptr)是指向虚函数表的指针,在一个被实例化的对象中,它总是被存放在该对象的地址首位。而虚函数表(vtbl)用于保存类包含的虚函数指针列表:
class Base {
public:
virtual void f() {
std::cout << "Base::f()" << std::endl;
}
private:
int n;
};
int main() {
Base* base = new Base;
return 0;
}
单继承下虚函数的内存布局
在单继承中,子类覆盖父类的虚函数,其实只需要在子类对应的虚函数表中覆盖对应的虚函数指针即可:
class Base {
public:
virtual void f() {
std::cout << "Base::f()" << std::endl;
}
private:
int n;
};
class Derived : public Base {
public:
void f() override {
std::cout << "Derived::f()" << std::endl;
}
virtual void k() {
std::cout << "Derived::k()" << std::endl;
}
private:
int h;
};
int main() {
Derived* derived= new Derived;
return 0;
}
多继承下虚函数的内存布局
class Base1 {
public:
virtual void f() {
std::cout << "Base1::f()" << std::endl;
}
private:
int n;
};
class Base2 {
public:
virtual void g() {
std::cout << "Base2::g()" << std::endl;
}
private:
int m;
};
class Derived : public Base1, public Base2 {
public:
void f() override {
std::cout << "Derived::f()" << std::endl;
}
void g() override {
std::cout << "Derived::g()" << std::endl;
}
virtual void k() {
std::cout << "Derived::k()" << std::endl;
}
private:
int h;
};
int main() {
Derived* derived= new Derived;
return 0;
}
C++虚函数与多继承的更多相关文章
- c++内存分布之虚函数(多继承)
系列 c++内存分布之虚函数(单一继承) c++内存分布之虚函数(多继承) [本文] 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
- c++内存分布之虚函数(单一继承)
系列 c++内存分布之虚函数(单一继承) [本文] c++内存分布之虚函数(多继承) 结论 1.虚函数表指针 和 虚函数表 1.1 影响虚函数表指针个数的因素只和派生类的父类个数有关.多一个父类,派生 ...
- Visual C++ 8.0对象布局的奥秘:虚函数、多继承、虚拟继承(VC直接输出内存布局)
原文:VC8_Object_Layout_Secret.html 哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleCl ...
- VC++对象布局的奥秘:虚函数、多继承、虚拟继承
哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...
- 虚函数重载(overwrite) 继承覆盖问题
引言 类接口需要添加默认参数,以适应不同情况调用, 但是clang-tidy 不允许在接口上设置默认参数,ps: 可能担心继承类里接口重新设置新默认参数而导致误用的情况 #include <st ...
- C++逆向分析----虚函数与多层继承
虚函数 C++通过关键字virtual来将函数声明为一个虚函数.当一个类包含虚函数后编译器就会给类的实例对象增加一个虚表指针,所谓的虚表指针就是指向虚表的指针.虚表就是一张地址表,它包含了这个类中所有 ...
- C++中的继承与虚函数各种概念
虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...
- C++ 派生类函数重载与虚函数继承详解
目录 一.作用域与名字查找 1.作用域的嵌套 2.在编译时进行名字查找 3.名字冲突与继承 4.通过作用域运算符来使用隐藏的成员 二.同名函数隐藏与虚函数覆盖 1.几种必须区分的情况 2.一个更复杂的 ...
- 【转】 C++的精髓——虚函数
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原 ...
随机推荐
- pwnable.kr之leg
查看原题代码: #include <stdio.h> #include <fcntl.h> int key1(){ asm("mov r3, pc\n"); ...
- jmeter做简单的压测
一.JMeter概述jmeter除了可以做借口测试外,还可以做压力测试:首先介绍jmeter中各个组件在压力测试中扮演的角色 1)线程(Threads(Users))即虚拟用户,线程组里可设置需要模拟 ...
- pycharm安装模块方法
一. 打开pycharm 二. 点开file 三. 点击Settings,点击Project Interpreter,选择右上角+ 四. 进入后,在搜索框搜索需要安装的模块,选中安装 击Project ...
- Python全栈工程师系列学习之学习记录
@ 目录 前言 Day 01 一.python的历史和种类 二.安装python解释器以及配置环境变量 三.变量.常量和注释 Day 02 Day 03 Day 04 Day 05 Day 06 一. ...
- [剑指Offer]56-数组中数字出现的次数(位运算)
题目一 数组中只出现一次的数字 题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字 题解 异或. 先考虑:数组中只有一个数字只出现了一次,其他数字都出现了 ...
- [程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
题意 给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点. 题解 在后序遍历过程中实现. 求解步骤按树形dp中所列步骤.可能性三种:左子树最大.右子 ...
- php处理的图片无法进CDN缓存
今天发现线上有个问题,线上一个图片域名,在前端已经加了CDN缓存,不落缓存,则用PHP动态实现图片缩放,但经PHP处理过的图片输出后,每次都要从后端读取,后端服务器压力瞬间增加,经分析,PHP中没有作 ...
- input输入框 只能输入数字 oninput = "value=value.replace(/[^\d]/g,'')" input输入框输入大于0的数字 oninput="value=value.replace(/\D|^0/g,'')"
项目中因为利用 element-ui 和avue两个ui框架搭建的 1.利用element-ui自带的校验需要注意点 prop :rules ref这三个属性 2.利用oninput时间进行校验 ...
- Java锁?分布式锁?乐观锁?行锁?
转载自:公众号来源:码农翻身 作者:刘欣 Tomcat的锁 Tomcat是这个系统的核心组成部分, 每当有用户请求过来,Tomcat就会从线程池里找个线程来处理,有的执行登录,有的查看购物车,有的下订 ...
- PYG5.4第十六期第一轮基础六题
1. HYWZ-dts音效大师破解https://www.chinapyg.com/thread-135090-1-1.html(出处: 飘云阁(PYG官方论坛) ) 2. HYWZ-LopeEdit ...