我有一堂课foo和bar。foo有资源。什么时候bar继承自foo它也会有内存的深层副本吗?还是我必须调用foofrom bars default-constructor 的构造函数?
class foo
{
char *item;
public:
foo() : item(new char[5]) {}
};
class bar : public foo {};
我有一堂课foo和bar。foo有资源。什么时候bar继承自foo它也会有内存的深层副本吗?还是我必须调用foofrom bars 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为你调用 的默认构造函数。