C++:类的虚函数及虚继承所占的空间

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个字节(两个表);

输出:

作者:csdn博客 Spike_King

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, 函数
, 虚函数
, 字节
, char
, public
, virtual
, virtual继承
虚继承
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-10-28 00:24:19

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

c++-父类非虚函数,子类继承变成虚函数,会发生什么

问题描述 父类非虚函数,子类继承变成虚函数,会发生什么 想法很奇葩,运行结果更是奇葩,大家看应该怎么解释一下,运行环境是vs2012 release Win32平台 代码: #include<iostream> using namespace std; class A { public: void foo() { printf("A类中:实foo()n"); } virtual void fun() { printf("A类中:虚fun()n"); }

实例讲解C++编程中的虚函数与虚基类_C 语言

虚函数① #include "stdafx.h" #include <iostream> using namespace std; class B0//基类B0声明 { public: void display(){cout<<"B0::display()"<<endl;}//公有成员函数 }; class B1: public B0//公有派生类B1声明 { public: void display(){cout<<

C++虚函数及虚函数表简析_C 语言

C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以看看相关的C++的书籍.在这篇文章中,我只想从虚函数的实现机制上面为大家 一个

C++虚函数及虚函数表解析

一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.纯虚函数(Pure Virtual Function):基类中没有实现体的虚函数称为纯虚函数(有纯虚函数的基类称为虚基类).C++  "虚函数"的存在是为了实现面向对象中的"多态",即父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数.通过动态赋值,实现调用不同的子类的成员

C++虚函数 纯虚函数 与多态的模糊解释

  //虚函数是多态的关键 virtual   我们直接定义对象 来调用函数并不能实现多态性 //多态的特性是 父类的指针可以指向子类的对象 我们可以令父类的指针指向 不同的子类对象MFC类库就是多态的原理 //比如下面我们如果同时让p1 p2分别指向新开辟的 A B类的对象 那么 调用print函数的时候就会出现都调用的基类的函数 //如何解决这个问题 呢? 那么就要用到虚函数了   我们解决的关键是将 基类的成员函数声明为虚函数 那么就可以实现多态 #include <iostream>

[面试珠玑]一道关于C++虚函数和多继承的面试题

问题:假设有两个基类A和B,它们有一个相同签名的虚函数void foo(), 但是拥有不同的实现.现在要求创建一个新类C,它同时继承A和B,也有相同的签名的函数void foo(), 并能分别对A和B中的foo函数进行重写(overwrite).     已知条件对应的代码如下: class A{ public: virtual void foo(){ cout<<"A::foo()"<<endl; } }; class B{ public: virtual v

静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #include<iostream> void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

Visual C++ 8.0对象布局的奥秘:虚函数、多继承、虚拟继承

从MS Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout .看个复杂的例子吧(如下),现在假设我们想知道Derived类的对象布局,怎么办? 在Project Properties->C++->Command Line->Additional Options里面加上/d1reportSingleClassLayoutDerived吧! class Co