0

如果一个类与另一个类具有“has-a”关系,并且它派生出同一个类,会发生什么?

class A
{
   friend classB;
   // here lots of things might be , but i just try to understand how should I think.
};

class B : public A
{
   // here again might be couple lines  of codes.

   protected:
      A d;
};

这里到底发生了什么?我应该怎么想?

4

3 回答 3

1

这没什么特别的。class A您有一个被调用的成员变量d,并且您class B还包含包含的所有class A内容以及添加到其中的所有内容。

乍一看,我真的看不出有多大用处,但我确信在某些情况下它可能会派上用场 - 有一个指向 A 对象的指针会更有意义,因为它会使它成为一个链表(或类似的)。

于 2013-05-07T09:51:59.780 回答
0

考虑:

struct Human {};

struct Superhuman : Human
{
    Human mentor;
};

或者也许是一个稍微不那么直接的例子:

struct Human
{
    virtual ~Human() {}
};

struct Girl : Human
{
    unique_ptr<Human> ptrToGirlfriendOrBoyfriend;
};

struct Boy : Human
{
    unique_ptr<Human> ptrToGirlfriendOrBoyfriend;
};

(根据需要替换unique_ptrshared_ptr...)

因此,有时编写用于继承的相同类型确实有意义,尽管我认为这种情况相当罕见。

friend但是,除非您真的,真的需要它,否则请丢失声明。

于 2013-05-07T09:59:35.580 回答
0

我不明白你为什么要在这里使用“朋友”。通过在 A 中声明 B 是一个朋友类,您是在说 A 信任 B 访问其私有成员。但是,B 派生自 A,因此如果您想从 B 访问 A 中的成员,但不允许其他任何访问,那么这些成员只需要“受保护”,而不是“私有”。

于 2013-05-07T10:01:21.577 回答