C++ - 类的虚函数\虚继承所占的空间

类的虚函数\虚继承所占的空间

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24236469

char占用一个字节,
但不满足4的倍数时, 会进行数据对齐,
使用4的倍数的字节(byte).

GCC:

GCC中, 不管是虚函数还是虚继承,
都须要将指针存储在虚函数表(virtual
function table)
, 占用4个字节.

继承会继承基类的数据, 和虚函数表, 即继承基类的空间.

代码:

/*
* test.cpp
*
* Created on: 2014.04.20
* Author: Spike
*/

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>

using namespace std;

class A {
char k[5];
public:
virtual void aa() {};
};

class B : virtual public A {
char j[6];
public:
virtual void bb() {};
};

class C : virtual public B {
char i[7];
public:
virtual void cc() {};
};

int main() {
std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
std::cout << "sizeof(B) = " << sizeof(B) << std::endl;
std::cout << "sizeof(C) = " << sizeof(C) << std::endl;

return 0;
}



输出:

sizeof(A) = 12
sizeof(B) = 24
sizeof(C) = 36

VS:

VS中, 正常情况下, 全部虚函数都写在一个虚函数表中,
派生类使用基类的虚函数表,
不会新建字节的虚函数表;

假设使用虚继承,
则派生类, 新建虚函数表和虚继承表,
即额外添加8个字节(两个表);

输出:

C++ - 类的虚函数\虚继承所占的空间,布布扣,bubuko.com

时间: 2024-12-14 05:28:00

C++ - 类的虚函数\虚继承所占的空间的相关文章

【整理】C++虚函数及其继承、虚继承类大小

参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/details/1948051/ 一.虚函数与继承 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1

C++中的 虚函数 纯虚函数 虚基类(virtual)

前言:需要了解三者的区别,必须要掌握多态的三个必要条件: 继承 重载 父类指针指向子类对象. 虚函数 纯虚函数 虚基类三者区别 1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的. 2.纯虚函数是用来定义接口的,也就是基类中定义一个纯虚函数,基类不用实现,让子类来实现. 3.虚基类是用来在多继承中,比如菱形继承中,如果两个父类继承自同一个类,就只实例化一个父类 ①虚函数第一个是没有使用多态(只用继承)的一般实现方式: class A { public:

C++学习 - 虚表,虚函数,虚函数表指针学习笔记

虚函数 虚函数就是用virtual来修饰的函数.虚函数是实现C++多态的基础. 虚表 每个类都会为自己类的虚函数创建一个表,来存放类内部的虚函数成员. 虚函数表指针 每个类在构造函数里面进行虚表和虚表指针的初始化. 下面看一段代码: // // main.cpp // VirtualTable // // Created by Alps on 15/4/14. // Copyright (c) 2015年 chen. All rights reserved. // #include <iostr

虚函数&amp;&amp;虚继承

如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的炼狱.这个C++中最复杂的继承层次在VS上的实现其实我没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧. 虚.实基类都没有虚函数 这种情况也还算比较简单.因为虚函数表指针一定是会放在最开始的,所以根据猜测也可以知道其大概布局情况.看下面一个简单的例子 #pragma pack(8) class F1{ public: int f1; F1():f1(0

C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问

0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生多态? 3.继承中的强制类型转换 4.小结 1.动态内存分配 1.1 new和malloc的区别 new关键字与malloc函数的区别: new关键字是C++的一部分 malloc是由C库提供的函数 new以具体类型为单位进行内存分配 malloc以字节为单位进行内存分配 new在申请内存空间时可进

C++ 虚函数 虚继承

C++ 的虚函数主要就是 实现多态机制,主要是通过一个虚函数表,知道具体的子类函数还是父类函数的地址,在执行. 先来看一个父类: 父类的虚函数表: 表中的最后一段区域 . 表示虚函数表的结束标志,若此处为1 还有下一个虚表 为0 虚表结束. 一般继承(没有覆盖的情况) 没有覆盖的情况下继承,子类的虚函数地址 存放在父类的后面: 继承(存在覆盖):多态 此时的虚函数表: 可以看到子类覆盖父类的函数f(); 所以当 Base * p = new Derived; p->f(); 在此虚函数表中,调用

虚函数 单继承无重写(overwrite)

#include <stdio.h> struct Base{    virtual void func1()    {        printf("Base func1()\n");    }    virtual void func2()    {        printf("Base func2()\n");    }    virtual void func3()    {        printf("Base func3()\n

C++虚函数作用原理(二)——类的继承

上一篇博客 C++虚函数作用原理(一) 开始 上一篇博客我们了解了虚函数到底是怎么存在的,那么这一篇我们就要开始考虑:虚函数的继承问题了. 首先我们可以回忆一下,我们之前在学习继承的时候存在函数覆盖这个概念.如果没有函数覆盖,那么当我们调用子类中和父类同名函数时,就会出现二义性,编译器无法知道你到底需要哪一个函数.那么对于虚函数的继承我们是不是也应该考虑同名函数的覆盖问题呢?----当然应该,那么这里我们就来通过代码验证一下: class A { int x; int y; public: vi

看到的关于虚函数继承及虚继承解释比较好的文章的复制

(来源于:http://blog.chinaunix.net/uid-25132162-id-1564955.html) 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1 { }; class Derived2:public Base1, public Base2 { }; int main(