Доступ к переменной надмножества из подмножества из другого подмножества

В классах C ++, как я могу получить доступ к переменной супер-набора из другого подмножества? Это может быть показано только визуально в качестве примера для понимания.

ЦРУ выше Президента и имеет право хранить конфиденциальную информацию от Президента.

class CIA {
public:
bool aliensExist = true; // 100%
};

class President {
public:
bool doAliensExist() {
return aliensExist; // Not sure, no access to CIA's aliensExist variable
}
};

class Subset : public President, public CIA {

};

int main() {
Subset subset;
cout << "Aliens exist = " << subset.doAliensExist() << endl;
}

Как я могу получить доступ aliensExist используя метод внутри President класс изнутри Subset учебный класс?

Я знаю, что приведенный выше пример нелогичен и, конечно, President не может получить доступ CIA без его непосредственного подмножества, но мне интересно, каков хороший подход для чего-то подобного?

0

Решение

Вы (более) неправильно используете наследование. Конечно, у вас есть проблемы с поиском решения, потому что модель в корне неверна. Кажется, у вас сложилось впечатление, что иерархия классов как-то аналогична математическим наборам …

Класс D должен наследовать от класса B если есть связь is a между ними, т.е. D is a B,

В вашем примере не имеет смысла наследовать от обоих CIA а также President потому что эта организация будет ЦРУ а также президент в то же время. Я думаю, что это против конституции (или, по крайней мере, незаконно).

Так что вам нужно изменить свою модель. ООП и наследование не святой Грааль, исправление для всего.

2

Другие решения

#include <iostream>
#include <stdexcept>

using namespace std;

class CIA {
public:
bool aliensExist = true;
};

class President {
public:
bool doAliensExist() {
return _doAliensExist();
}

private:
virtual bool _doAliensExist() {
throw runtime_error("cannot access");
}
};

class Subset : public President, public CIA {
private:
virtual bool _doAliensExist() {
return aliensExist;
}
};

int main() {
cout << "Aliens exist = " << Subset().doAliensExist() << endl;
}
1

Ну, я бы не рекомендовал использовать его в рабочем коде, но так как это кажется теоретическим вопросом …

Можно динамически передать это в Subset * (и также можно использовать приведение типа c-style (Subset*)this, но это не бросило бы в случае несовместимых классов):

#include <iostream>
#include <stdexcept>
using namespace std;

class CIA {
public:
bool aliensExist = true;
};

class President {
public:
virtual bool doAliensExist();
};

class Subset : public President, public CIA {
};

bool President::doAliensExist() {
Subset* subset = dynamic_cast<Subset*>(this);
if(!subset)
{
std::runtime_error("cannot access");
}
return subset->aliensExist;
}

int main() {
Subset subset;
cout << "Aliens exist = " << subset.doAliensExist() << endl;
}

в вопросе не было четких ограничений на изменения в Президенте, поэтому, возможно, можно сделать виртуальный doAliensExist (), чтобы сделать класс полиморфным. С броском в стиле C это не нужно.

Хотя, подумав еще раз, добавление виртуальной функции вместо изменения doAliensExist () будет вполне оправданным:

class President {
public:
bool doAliensExist();
virtual void dummy() {};
};
0
По вопросам рекламы [email protected]