C++ 从同一类派生并合成的。C++;

C++ 从同一类派生并合成的。C++;,c++,inheritance,composition,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

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

这到底是怎么回事?我该怎么想呢?

这没什么特别的。您有一个名为
d
class a
成员变量,您的
class B
也包含class a包含的所有内容,以及添加到其中的任何额外内容

我一眼就看不出它有什么用处,但我相信在某些情况下它可能会派上用场——有一个指向对象的指针会更有意义,因为它会使它成为一个链表(或类似的东西)

考虑:

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;
};
struct-Human
{
虚拟~Human(){}
};
结构女孩:人类
{
独特的女朋友或男朋友;
};
结构男孩:人类
{
独特的女朋友或男朋友;
};
(必要时将
unique_ptr
替换为
shared_ptr

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


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

我不明白你为什么要在这里使用“friend”。通过在A中声明B是朋友类,您是说A信任B访问其私有成员。但是,B源于A,因此如果您想从B访问A中的成员,但不允许任何其他访问,那么这些成员只需要“受保护”,而不是“私有”。您有什么问题吗?我妻子是一位母亲,并且有一位母亲。很难想象吗?为什么会有一个B班的朋友;在A班,由于B班:公共A,我已经达到了A班的所有要求。我错了吗?好的,所以我没有把这当作“重要的”(你的问题在这方面不清楚)。它允许
B
访问
d
的内容,而无需通过
A
中的访问器函数。与没有继承相同。它指的是“friend classB;”?@L-caesar friend类可以访问
private
成员,而派生类不能,因此不,您没有仅使用
class B:public A
“访问”A中的所有内容。是的,因此B是A的朋友,这意味着B可以访问所有“any”类A本身不知道的对象。所以如果你有
类B{void doSomething(A){int x=a.private_int;正如我在评论中所说的那样,
a
中的
friend B
声明允许
B
访问
d
对象的私有和受保护字段,而不需要
a
的访问函数。啊,这是有意义的。我在你的评论和评论之前回答了没有注意到A的例子!我仍然想不出一个设计,你真的想这样做。不,我也不相信我曾经使用过这个模型,但我相信它在宇宙中某些奇异的地方有一些用处。@Merlin069也许在现实生活中没有这样的代码,但是,理论上你应该知道如何使用它我不反对,但如果有人能提供这样的案例,我会很感兴趣的。