2017-09-27 51 views
0

在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://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –

+0

基類沒有彼此的知識。 'Subset'類具有,並且可能能夠進行協調。 –

+0

除非你對「這樣的事情」更具體,否則你只會得到評論或者反對票。正如前面的2條評論所說,可能有辦法實現你想要的,但你應該清楚地告訴你確實想要的是什麼,因爲清楚的例子並不具有代表性(你無法訪問外星人從總統那裏存在,就像你自己說的那樣) –

回答

1
#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

0

好吧,我不建議在生產代碼中使用它,但因爲這似乎是一個理論性的問題......

這是可能的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() {}; 
}; 
2

您是(在)使用繼承錯誤。當然你有問題尋找解決方案,因爲這個模型從根本上說是錯誤的。你似乎是的印象是類層次結構在某種程度上模擬數學組下...

D應該從一個類繼承B當且僅當有他們之間is a的關係,即D is a B

在您的例子是沒有意義的,從兩個CIAPresident繼承,因爲該實體將是CIA ,並在同一時間總裁。我認爲這是違反憲法(或者至少是非法的)。

所以你需要改變你的模型。面向對象和繼承不是一個聖盃,一切的解決方案。