派生表中第一个基类没有虚函数,派生类存在虚函数时的内存布局


单继承的例子:

#include <iostream>

using namespace std;

class A
{
public:
    A()
    {
        a = 1;
        ch = ‘a‘; //ASCII码97
    }
private:
    int a;
    char ch;
};

class C : public A
{
public:
    C()
    {
        c = 3;
    }
    virtual void print()
    {
        cout << "C" << endl;
    }
private:
    int c;
};

int main()
{
    C c;
    int *p = (int *)&c;
    for (int i = 0; i < 4; i++)
    {
        cout << p[i] << endl;
    }
    //C的内存布局:
    //vptr
    //a
    //ch后面填充了3个字节
    //c

    return 0;
}

实验结果:

结论:单继承情况下基类没有虚函数,派生类存在虚函数时,派生类的vptr会被放在最前面,接着是基类数据成员,然后是派生类数据成员。

多重继承的例子:

时间: 2024-12-26 12:55:31

派生表中第一个基类没有虚函数,派生类存在虚函数时的内存布局的相关文章

一起talk C栗子吧(第一百三十四回:C语言实例--创建线程时的内存细节)

各位看官们,大家好,上一回中咱们说的是"创建进程时的内存细节"的例子,这一回咱们说的例子是:创建线程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍过创建线程的例子,创建线程时使用的函数是pthread_create.今天我们一起说一下使用该函数创建线程时内存的一些细节问题.我们介绍的的重点还是内存布局中的四个分区.这点和前一回中介绍创建进程时内存细节的思路相同. 1.在主线程中使用pthread_create函数可以创建一个新线程,我们叫

字符流中第一个不重复的字符-剑指Offer

字符流中第一个不重复的字符 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l". 输入描述 如果当前字符流没有存在出现一次的字符,返回#字符. 思路 模拟一个哈希表,长度为256,索引为字符的编码,初始化为-1,第一次出现时把该字符出现的位置赋给该数组元素,第二次出现时

顺序表之删除表中元素最小值

1 #include<stdio.h> 2 #define MAX 10//表的长度为10 3 typedef int ElementType; 4 int length=0; 5 int value,pos;//记录值和位置 6 typedef struct { 7 ElementType i; 8 int length; 9 ElementType data[MAX]; 10 }Sorder; 11 //主要删除最小值的函数代码 ,由此可见删除了最小值1,位于数组0的位置 12 bool

MySQL 子查询(三) 派生表、子查询错误

From MySQL 5.7 ref:13.2.10.8 Derived Tables 八.派生表 派生表是一个表达式,用于在一个查询的FROM子句的范围内生成表. 例如,在一个SELECT查询的FROM子句中的子查询,就是一个派生表. SELECT ... FROM (subquery) [AS] tbl_name ... [AS] tbl_name子句是必需的,因为FROM子句中的每个表都必须具有名称.且派生表中的任何列都必须具有唯一名称. 为了便于说明,假设现在有这样一个表: CREATE

wordpress 常用函数-wpdb类

与数据库建立接口 WordPress为用户提供了一系列用于数据库操作的函数类--wpdb.Wpdb类建立在Justin Vincent编写并维护的ezSQL类的基础上. 使用须知 不可直接调用wpdb类中的方法,应使用全局变量$wpdb.$wpdb是WordPress提供的一个全局变量,该全局变量是负责与WordPress数据库交流的类的实例化.(在自定义函数中使用$wpdb前,请记住全局化$wpdb.) 可以用$wpdb对象从任何一个WordPress数据库表(而非仅仅标准数据库表)中读取数据

虚继承之单继承的内存布局(VC在编译时会把vfptr放到类的头部,这和Delphi完全一致)

C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼.虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内存空间中又是如何布局的,却可以对C++的了解深入不少.这段时间花了一些时间了解这些玩意,搞得偶都,不过总算有些收获,嘿嘿. 先看一段代码class A{      virtual aa(){};}; class B : public virtual  A{      char j[3];      

函数模板&amp;类模板

1.函数模板 关键字template总是放在模板的定义与声明的最前面.关键字后面是用逗号分隔的模板参数表,它用尖括号(<>)括起来.该列表是模板参数表,不能为空.模板参数分为:(1) 模板类型参数,代表一种类型:(2) 模板非类型参数,代表一个常量表达式. eg:        template <class Type>        Type min(Type a,Type b)        {              return a<b ? a : b;      

【转载】 C++多继承中重写不同基类中相同原型的虚函数

本篇随笔为转载,原文地址:C++多继承中重写不同基类中相同原型的虚函数. 在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA { public: virtual void TestA(); }; class CBaseB { public: virtual void TestB(); }; class CDerived : public CBaseA, public CBaseB { public: virtual void TestA()

C++_派生类的构造函数及派生类和基类之间的特殊关系

派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. 1 //声明一个基类 2 class TableTennisPlayer 3 { 4 private: 5 string firstname; 6 string lastname; 7 bool hasTable; 8 9 public: 10 TableTennisPlayer(); 11 void Name() const; 12 bool HasTable() c