В классах 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
без его непосредственного подмножества, но мне интересно, каков хороший подход для чего-то подобного?
Вы (более) неправильно используете наследование. Конечно, у вас есть проблемы с поиском решения, потому что модель в корне неверна. Кажется, у вас сложилось впечатление, что иерархия классов как-то аналогична математическим наборам …
Класс D
должен наследовать от класса B
если есть связь is a
между ними, т.е. D is a B
,
В вашем примере не имеет смысла наследовать от обоих CIA
а также President
потому что эта организация будет ЦРУ а также президент в то же время. Я думаю, что это против конституции (или, по крайней мере, незаконно).
Так что вам нужно изменить свою модель. ООП и наследование не святой Грааль, исправление для всего.
#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;
}
Ну, я бы не рекомендовал использовать его в рабочем коде, но так как это кажется теоретическим вопросом …
Можно динамически передать это в 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() {};
};