将内存分配给基类的对象时,是否也分配了派生类的内存
when allocating memory to an object of base class, does the memory for the derived class is allocated too?
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 *。
类A
不知道其派生类(它们可能在物理上是完全分开的,在其他汇编单元中,以后在运行时加载)。即使这样做,也没有任何派生类分配空间的意义 - 因为它是不是 。
就像父母不为孩子上学一样,班级不会在其派生的班级中行事。
VTable创建的vtable是否适合INTS A和B的大小,或者分配的空间仅适合A类型A?
的对象
这些成员无论如何都不会进入VTable。至于 do 进入vtable(=虚拟函数)的成员,上述适用:base类'vtable仅足以用于虚拟函数 it it 声明,并且没有其他。
仅A
。
否则,当某人创建新类时,A
将会增长:C
,D
,E
,...所有这些都来自A
。这将是荒谬的。
它不会创建一个vtable-(通常)每个类中的一个。它创建一个类型A
的对象,并为A
的成员提供足够的空间。它不会创建类型B
(或其他任何内容)的对象,因为这不是新表达式指定的类型。
no ,原因很简单:
a 类不包含 b 类成员或方法。
=>因此,不需要B的内存空间
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?