我有一堂课foo
和bar
。foo
有资源。什么时候bar
继承自foo
它也会有内存的深层副本吗?还是我必须调用foo
from bar
s default-constructor 的构造函数?
class foo
{
char *item;
public:
foo() : item(new char[5]) {}
};
class bar : public foo {};
我有一堂课foo
和bar
。foo
有资源。什么时候bar
继承自foo
它也会有内存的深层副本吗?还是我必须调用foo
from bar
s default-constructor 的构造函数?
class foo
{
char *item;
public:
foo() : item(new char[5]) {}
};
class bar : public foo {};
派生类具有:
All the members of base class + the additional members in derived class
构造函数的调用顺序是明确定义的,基类构造函数总是在派生构造函数之前调用。根据您使用成员初始化列表的方式,将调用默认基类构造函数或参数化版本。
但它始终是基类构造函数,后跟派生类构造函数。所以不确定你的第二个Q是什么。
准确地说,请删除该char *
成员并使用std::string
.
class foo
{
//char *item; ----------------> Erroneous, difficult to handle
std::string item;
....
您可以将内存布局视为两个子结构foo
,并bar
聚集在一个名为bar
.
您的 bar 类在内存中将如下所示:
*******
foo members:
-char* item (sizeof(char*)
*******
bar members:
*******
当您创建一个新的bar
时,您将为这两个结构保留内存。在您的情况下,这将为 char* 保留足够的内存,对于 x86 编译器,这可能是 4 个字节。
在正常用例中,bar
的构造函数将包含与bar
' 成员相关的所有内容。的构造函数也可以在初始化列表或原始调用中bar
“手动”调用构造函数。foo
否则编译器会foo
为你调用 的默认构造函数。