-2

我有一堂课foobarfoo有资源。什么时候bar继承自foo它也会有内存的深层副本吗?还是我必须调用foofrom bars default-constructor 的构造函数?

class foo
{
    char *item;
    public:
        foo() : item(new char[5]) {}
};

class bar : public foo {};
4

2 回答 2

5

派生类具有:

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;

    ....
于 2013-05-04T12:06:17.433 回答
1

您可以将内存布局视为两个子结构foo,并bar聚集在一个名为bar.

您的 bar 类在内存中将如下所示:

*******
foo members:
-char* item (sizeof(char*)
*******
bar members:
*******

当您创建一个新的bar时,您将为这两个结构保留内存。在您的情况下,这将为 char* 保留足够的内存,对于 x86 编译器,这可能是 4 个字节。

在正常用例中,bar的构造函数将包含与bar' 成员相关的所有内容。的构造函数也可以在初始化列表或原始调用中bar“手动”调用构造函数。foo否则编译器会foo为你调用 的默认构造函数。

于 2013-05-04T12:21:32.613 回答