Что произойдет, если у класса есть отношение 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;
};
Что на самом деле здесь происходит? Как я должен думать об этом?
Ничего особенного в этом нет. У вас есть переменная-член class A
называется d
, и ваш class B
также содержит все, что class A
содержит, и все, что добавлено к нему.
С первого взгляда я не вижу в этом ничего полезного, но я уверен, что есть обстоятельства, когда это может пригодиться — указатель на объект 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;
};
(Заменить unique_ptr
с shared_ptr
как необходимо…)
Так что бывают случаи, когда сочинение одного и того же типа используется для наследования делает имеет смысл, хотя я бы предположил, что это довольно редко.
Потерять friend
декларация, хотя, если вы действительно, действительно нужно это.
Я не понимаю, почему вы захотите использовать «друг» здесь. Утверждая в A, что B — класс друзей, вы говорите, что A доверяет B для доступа к своим закрытым членам. Однако B происходит из A, поэтому, если вы хотите получить доступ к членам в A из B, но не разрешаете доступ к чему-либо еще, тогда эти члены просто должны быть «защищены», а не «частными».