2013-12-20 158 views
1

的我有一個類作爲基類, 和B類,C從A 派生類和有類d誰具有數據成員類型A(組合物)的(指針陣列)數組對象和繼承

enter code here 

class D{ 
A **a; 
int size; 
....... 
a = new A*[size]; 
...... 
}; 

和我有Print方法,在它的body中我必須具有給定ID(B和C都有數據成員ID)的特定元素(如果它來自類B或C),應該有2個選項可以打印功能......用於B類的打印元素,還是用於C類的打印元素? 我如何具體的元素?

我做了A級抽象!

enter code here 
class A{ 
....... 
virtual void print()=0; 
}; 

class B :public A{ 
........ 
........ 
void print(){ 
.......} 
}; 

類C:公共A { ........ ........ 空隙打印(){ .......} };

class D{ 
........ 
....... 
void Print() 
int P; 
cout<<" if you want to print class B elements enter 1 , or 2 for class C"<<endl; 
cin>>P; 
if(P==1){ 
dynamic_cast<B*>(*a)->print(); } 
else 
if (P== 2){ 
dynamic_cast<C*>(*a)->print(); } 

我在這裏的問題是我如何具體的元素,如果它從類B或C ???

+0

是什麼,你的類ID是什麼意思? –

+1

你應該真的避免數組的原始分配。改爲使用'std :: vector'。 – Sean

+0

@ richard.g它是B類和C類的數據成員,我應該從用戶那裏收到它,然後指定它(從B類或C類)? –

回答

2

我假設一對夫婦的東西在這裏,特別是在a成員實際包含指向的A子類 - 即B S和C秒。

我還假設在print方法中,當你迭代這個數組時,你不知道哪個是哪個。

如果你不關心哪個是哪個了,只是希望不管他們是什麼類型的打印對象的屬性,那麼你可以提供Avirtual方法返回一個std::string(或某事),你想到print(),並調用該方法在迭代:

class A 
{ 
public: 
    virtual std::string printMe() const = 0; 
}; 

class B : public A 
{ 
public: 
    std::string printMe() const { return "I'm a B"; } 
}; 

class C : public A 
{ 
public: 
    std::string printMe() const { return "I'm a C"; } 
}; 

如果你只打印兩種類型BC的對象,那麼你就需要能夠確定哪些使用dynamic_cast是。由於使用dynamic_cast這種方式only works與多態類型,您需要確保A至少有1 virtual函數。然而,這是可以的,因爲A在抽象層次結構中被使用,所以你真的應該有一個virtual析構函數,這就夠了。

class A 
{ 
public: 
    virtual ~A() {}; 
}; 

現在你可以使用dynamic_cast

void A::print() 
{ 
    for (size_t i = 0; i < size; ++i) 
    { 
    A* theObj = a[i]; 
    // assuming we only want to print B's... 
    B* theB = dynamic_cast <B*> (theObj); 
    if (theB) 
    { 
     theB->printObj(); 
    } 
    } 
} 
+0

你的B班printMe返回「我是A」,這是真的,但你可能意思是「我是B」。 你的班級C的printMe返回「我是B」這是不正確的,應該是「我是C」 – YoungJohn

+0

@YoungJohn:謝謝你指出我的笨拙。固定。 –

+0

@JohnDibling非常感謝你,但是A班的印刷品是「virtual void print()= 0;」 ,我重寫它在B和C,我的問題在這裏是我怎麼能具體的元素,如果它是從類B或C在打印類** D **? –