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

时间:2014-01-30 13:19:57

标签: c++ memory-management vtable

class A {
     private:
           int _a;
     public:
           //some virtual methods...
};

class B : public A {
     private:
           int _b;
     public:
            //methods..
};

当声明类型A的指针时:

A* a = new A();

创建的 vtable 是否符合整体a和b的大小,或者分配的空间是否只适合A类型的对象?

6 个答案:

答案 0 :(得分:4)

当然不是!!

班级A不知道班级B

的存在

但是课程B会继承A,所以它确实知道A

换句话说,它恰恰相反:

创建类B的实例时分配的内存空间足以容纳类B的成员和类A的继承成员

答案 1 :(得分:2)

您创建了A类型的对象。因此将为此类对象分配内存。它足够大以包含int _a和vptr。我想如果指针的大小等于4,那么将为类型A的对象分配8个字节。

您应该理解,基类对基于基类定义的派生类一无所知。

但是如果你要写

A* a = new B();

然后将在内存中创建类型B的对象。但是指针a的静态类型是A *。因此,如果没有dynamic_cast或static_cast指针a,则无法访问数据成员_b以键入B *。

答案 2 :(得分:1)

A不知道它的派生类(它们可能在物理上是完全独立的,在其他编译单元中,稍后在运行时加载)。即使它确实如此,为所有派生类分配空间也没有意义 - 因为它它的派生类。

就像父母不为孩子上学一样,一个班级不会代替其衍生班级。

  

创建的vtable是否符合整数a和b的大小,或者分配的空间是否只适合A类型的对象?

无论如何,这些成员都不会进入vtable。对于进入vtable(=虚函数)的成员,以上适用:基类'vtable仅对于虚拟函数声明的大小,并且没有其他人。

答案 3 :(得分:1)

A

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

,原因很简单:

类不包含任何 B 类成员或方法。

=>因此,B的存储空间不是必需的