从另一个子集内的子集内访问超集变量
在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
使用从Subset
类内内President
类中的方法?
我知道上面的例子是不合逻辑的,当然President
不能访问CIA
而不是它的直接子集,但我想知道什么是这样的好方法?
#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'类不需要协调其中的任何一个,只需要'President'类,那么它至少是可取的。 – Acidic
好吧,我不建议在生产代码中使用它,但因为这似乎是一个理论性的问题......
这是可能的dynamic_cast的这期在子集*(它也将是可以使用C风格的类型转换(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() {};
};
您是(在)使用继承错误。当然你有问题寻找解决方案,因为这个模型从根本上说是错误的。你似乎是的印象是类层次结构在某种程度上模拟数学组下...
类D
应该从一个类继承B
当且仅当有他们之间is a
的关系,即D is a B
。
在您的例子是没有意义的,从两个CIA
和President
继承,因为该实体将是CIA ,并在同一时间总裁。我认为这是违反宪法(或者至少是非法的)。
所以你需要改变你的模型。面向对象和继承不是一个圣杯,一切的解决方案。
使'doAliensExist()'为抽象方法,并在'Subset'中覆盖它。有关更多信息[请参阅您的C++书籍](https://*.com/questions/388242/the-definitive-c-book-guide-and-list)。 –
基类没有彼此的知识。 'Subset'类具有,并且可能能够进行协调。 –
除非你对“这样的事情”更具体,否则你只会得到评论或者反对票。正如前面的2条评论所说,可能有办法实现你想要的,但你应该清楚地告诉你确实想要的是什么,因为清楚的例子并不具有代表性(你无法访问外星人从总统那里存在,就像你自己说的那样) –