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类型的对象?
答案 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
会增长:C
,D
,E
,...所有这些都来自A
。这将是荒谬的。
答案 4 :(得分:1)
它不会创建一个vtable - 每个类(通常)只是其中一个。它创建了一个A
类型的对象,其中A
的成员有足够的空间。它不会创建B
类型的对象(或其他任何东西),因为它不是新表达式指定的类型。
答案 5 :(得分:1)
否,原因很简单:
类不包含任何 B 类成员或方法。
=>因此,B的存储空间不是必需的