从另一个子集内的子集内访问超集变量

问题描述:

在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而不是它的直接子集,但我想知道什么是这样的好方法?

+1

使'doAliensExist()'为抽象方法,并在'Subset'中覆盖它。有关更多信息[请参阅您的C++书籍](https://*.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

基类没有彼此的知识。 'Subset'类具有,并且可能能够进行协调。 –

+0

除非你对“这样的事情”更具体,否则你只会得到评论或者反对票。正如前面的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; 
} 
+0

这是一个有效的答案,但如果还有其他答案,我会等待。如果'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

在您的例子是没有意义的,从两个CIAPresident继承,因为该实体将是CIA ,并在同一时间总裁。我认为这是违反宪法(或者至少是非法的)。

所以你需要改变你的模型。面向对象和继承不是一个圣杯,一切的解决方案。