Причина, по которой вы не можете войти в систему от D
, состоит в том, что они private
, а это значит, что они доступны только с точностью до D
. Для того, чтобы иметь возможность получить доступ к ним только из D
или его подклассов, вам нужно использовать модификатор protected
доступа вместо:
class C
{
private:
int x;
int y;
int energy;
protected:
A &a;
B &b;
public:
C(A &a, B &b);
void print(void);
virtual void printAt(void);
/// ...
};
Теперь немного терминологии:
При вводе class C : public D
вы не сделав его friend
, вы наследуете его. Это означает, что C
будет базовым классом D
. Друг - это другая, связанная концепция.
Друг какого-то класса - это еще один класс, который имеет доступ к своим private
свойствам. Итак, если вы вместо этого сделали D
a friend
из C
, у вас был бы доступ к a
и b
, не делая их protected
. Это можно было бы осуществить, как, например:
class C
{
// Some code...
friend D;
//Lots of code ...
}
Пожалуйста, обратите внимание, что для этой работы, вы должны объявить D
перед тем C
.
Теперь, какой из этих вариантов вы должны использовать?
Задайте себе этот вопрос: D
логически более конкретный тип C
? Если это так, он должен использовать наследование.Если нет, то может быть лучше сделать D
членом категории C
и использовать ключевое слово friend
. В любом случае, используйте friend
экономна, и только если есть обязательно очень тесная взаимосвязь между этими двумя классами (возможно, если D
является заводом по типу C
и C
имеет частный конструктор.)
Вы не делаете его _ «друг» _, вы унаследовали от него. –
Перейдите к [inheritance] (http://stackoverflow.com/a/860353/57318) и [общедоступный/защищенный/закрытый доступ] (http://stackoverflow.com/a/614844/57318). Мы можем ответить на это за вас, но я боюсь, что вы не поймете, почему. – Xymostech