派生和合成同一个班级。 C ++

时间:2013-05-07 09:47:21

标签: c++ inheritance composition

如果某个类与另一个类有“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;
};

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

3 个答案:

答案 0 :(得分:1)

没有什么特别的。您的成员变量class A名为dclass B也包含class A包含的所有内容,以及其他任何内容。

我一眼就看不出真正有用的东西,但我确信在某种情况下它可能派上用场 - 指向A物体的指针会更有意义,因为它会使它成为现实链表(或类似的)。

答案 1 :(得分: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_ptr替换为shared_ptr ...)

所以有时候编写用于继承的相同类型确实是有道理的,尽管我认为它很少见。

虽然丢失了friend声明,除非你真的,真的需要它。

答案 2 :(得分:0)

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