将内存分配给基类的对象时,是否也分配了派生类的内存

when allocating memory to an object of base class, does the memory for the derived class is allocated too?

本文关键字:分配 内存 是否 派生 对象 基类      更新时间:2023-10-16
class A {
     private:
           int _a;
     public:
           //some virtual methods...
};
class B : public A {
     private:
           int _b;
     public:
            //methods..
};

在声明A类型的指针时:

A* a = new A();

vtable 创建的适合INTS A和B的大小,或者该空间分配仅适合A类型A?

的对象

当然不是!

A不知道B类的存在

但是B类继承A,因此确实知道A

换句话说,发生的情况是相反的:

创建类B实例时分配的内存空间足以保持B类的成员和类A

的继承成员

您创建一个类型A的对象。因此,将为此类对象分配内存。它足够大,可以包含int _a和vptr。我认为,如果指针的大小等于4,则将分配给A。

的对象8个字节

您应该了解基类对基于基类定义的衍生类别一无所知。

但是,如果您会写

A* a = new B();

然后,将在内存中创建一个类型B的对象。但是指针A的静态类型为A *。因此,如果没有Dynamic_cast或static_cast指针A类型B *。

,您无法访问数据成员_b

A不知道其派生类(它们可能在物理上是完全分开的,在其他汇编单元中,以后在运行时加载)。即使这样做,也没有任何派生类分配空间的意义 - 因为它是不是

就像父母不为孩子上学一样,班级不会在其派生的班级中行事。

VTable创建的vtable是否适合INTS A和B的大小,或者分配的空间仅适合A类型A?

的对象

这些成员无论如何都不会进入VTable。至于 do 进入vtable(=虚拟函数)的成员,上述适用:base类'vtable仅足以用于虚拟函数 it it 声明,并且没有其他。

A

否则,当某人创建新类时,A将会增长:CDE,...所有这些都来自A。这将是荒谬的。

它不会创建一个vtable-(通常)每个类中的一个。它创建一个类型A的对象,并为A的成员提供足够的空间。它不会创建类型B(或其他任何内容)的对象,因为这不是新表达式指定的类型。

no ,原因很简单:

a 类不包含 b 类成员或方法。

=>因此,不需要B的内存空间