我有一個具有相當複雜的繼承結構的程序,所以我不會用它來顯示我的問題,而是使用不好的樣式以下結構讓事情變得簡單:C++將派生類存儲在單個向量中,派生類不包含重定義方法
class A {
public:
int va1;
int va2;
string va3;
virtual void fa1(int x1, string x2) {
// method body
}
int fa2 (bool y1, double y2) {
// method body
}
A() {
}
virtual ~A() {
}
};
class B :
public A
{
public:
bool ab1;
double ab2;
long double ab3;
bool fb1(double x1) {
//method body
}
long double fb2() {
//method body
}
B(int z1) {
ab2 = z1;
}
virtual ~B() {
}
};
class C :
public A
{
public:
int ac1;
long double fc1() {
//method body
}
virtual void fa1(int x1, string x2) {
// method body
}
C() {
}
virtual ~C() {
}
};
正如你所看到的,B和C主要由完全新的變量和方法,並使用A-指針結合虛擬的方法獲得了不重新定義從A 那些結果,」工作。
到現在爲止,我總是使用單獨的向量或數組作爲派生類,因爲我很少編寫主要由僅重新定義基類的方法的派生類組成的程序。
我知道我不能簡單地創建一個As的向量並且放入Bs和Cs而不會丟失信息。
我的問題是,是否有可能將As,Bs和Cs以指針或其他形式存儲在單個向量中,並且仍然可以訪問A中不存在的所有方法和變量?
如果它不適用於矢量,是否有替代品(數組可能)?
該代碼可以包含現代C++(標準,std :: string而不是char *等),因爲不需要與C或傳統C++兼容。
您可以隨時將所有內容存儲爲'A *',然後嘗試['dynamic_cast'](http://en.cppreference.com/w/cpp/language/dynamic_cast)到所需的派生類型。如果演員失敗失敗,那麼你知道你不能調用該函數。 – NathanOliver
爲什麼_使用與虛擬方法結合的指針將無法工作_?此外,你會失去什麼信息,只需創建一個As的向量並放入Bs和Cs_中? – Amit
[OT]由於何時使用'std :: string'變成「* modern C++ *」?! – yzt