C++ c++;成员函数和类大小

C++ c++;成员函数和类大小,c++,C++,可能重复: 当我第一次学习继承时,我的老师说,与数据成员不同,成员函数不会改变类的大小。也就是说,如果类B继承自类A,则当且仅当至少添加一个数据成员时,B的大小将大于A的大小,并且不会因函数成员数量而改变。 对吗?如果是,这一机制是如何运作的?似乎这两个成员都应该保存在堆中,因此在大小上会有所损失 谢谢,, Guy成员变量存储为每个类实例的一部分。但成员职能并非如此 类的每个实例都必须有每个成员变量的单独副本。这使每个对象保持唯一性 但是成员函数是代码。而且,无论一个特定类有多少个实例,绝对没

可能重复:

当我第一次学习继承时,我的老师说,与数据成员不同,成员函数不会改变类的大小。也就是说,如果类B继承自类A,则当且仅当至少添加一个数据成员时,B的大小将大于A的大小,并且不会因函数成员数量而改变。 对吗?如果是,这一机制是如何运作的?似乎这两个成员都应该保存在堆中,因此在大小上会有所损失

谢谢,,
Guy

成员变量存储为每个类实例的一部分。但成员职能并非如此

类的每个实例都必须有每个成员变量的单独副本。这使每个对象保持唯一性

但是成员函数是代码。而且,无论一个特定类有多少个实例,绝对没有理由拥有多个代码副本。同样的代码只是对实例数据进行操作

因为代码是不同的,所以代码不是类实例大小的一部分。而
sizeof(myClass)
将不包括代码占用的字节

如果类B继承自类A,则B的大小将大于 A的大小当且仅当至少将添加一个数据成员时,以及 不会因函数成员数量而更改

是的,这是正确的。(如果B没有实现其他方法)。 每个类实例都有一个数据成员的副本和一个指向实际存储它们的成员函数表的指针

成员函数的代码在同一类的不同实例之间共享。如果B不重写基类A的任何成员函数,则A和B可以共享相同的方法。 当您重写子类中的成员函数时,基本上您是在更改此机制,创建被重写成员函数的新定义,仅适用于您定义它的子类(es.B)

通常,成员函数在编译时绑定。因此,如果通过指向基类a的指针引用子类B的实例,并调用两个类中定义的成员函数foo(),则调用的函数将是在基类中实现的函数。
您可以强制在运行时绑定成员函数,并将其声明为虚拟(调用的成员函数将是通过基指针指向的类的实际类型之一)。这将导致使用一个附加表(虚拟方法表)来存储虚拟方法,并为每个调用使用一个双指针间接寻址

您可以想象调用成员函数
myClass.myMethod(x)
类似于
myMethod(myClass,x)
。该函数不需要存在于类的每个实例中。你可以使用<代码>这个>关键字访问这个“隐藏的”第一个参数。

“方法”在C++领域中不是一个定义良好的术语。恰当的术语是“成员函数”,这实际上是在标准中定义的。但C++中的“方法”不是一个定义良好的术语。恰当的术语是“成员函数”,这实际上是在标准中定义的。另外,OP没有提到虚拟函数,所以我认为这里不需要vtable引用(而且,vtable只是另一个成员变量);可能根本就没有堆。将其称为动态存储(用于“堆”)和自动存储(用于“堆栈”),这两种方法都是正确的,即使在堆和堆栈不是这些存储类的实际实现的情况下也是如此。在一个类中有一个或多个虚拟成员函数会添加指向它的虚拟表指针。因此,如果A没有虚拟成员函数,但B添加了一个虚拟成员函数,那么
sizeof(B)
将大于
sizeof(A)
@Csq,vptr本质上是成员变量。