2013-12-20 5 views
1

Я имею класса А в качестве базового класса, и класс В, С производные классы от А и есть класс D, у кого элемента данных (указатель на массив) типа А (композиции)массив объектов и наследование

enter code here 

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

и у меня есть метод печати. ​​В его теле есть определенный элемент (если он из класса B или C) с заданным идентификатором (оба B и C имеют идентификатор элемента данных) должно быть два варианта печати функции .. элементы печати для класса B или элементы печати для класса C? Как я могу определить конкретные элементы?

Я сделал класс A абстрактным !!

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

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

класс С: публике { ........ ........ недействительным печати() { .......} };

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

что это значит идентификатор класса? –

+1

Вы должны действительно избегать необработанного распределения массивов. Вместо этого используйте 'std :: vector'. – Sean

+0

@ richard.g Это элемент данных как в классе B, C! I должен был получить его от пользователя, а затем указать его (из класса B или C)? –

ответ

2

Я предполагаю, что несколько вещей здесь, в частности, что a член фактически содержит указатели на подклассы A - то есть, B с и C с.

Я также предполагаю, что в методе print, когда вы повторяете этот массив, вы не знаете, что есть.

Если вы не заботитесь, что есть что и просто хотите, чтобы напечатать атрибуты объекта независимо от того, какого типа они, то вы могли бы обеспечить чистый virtual метод в A который возвращает 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"; } 
}; 

Если вы только хотите печатать объекты любого типа B или C, то вы должны быть в состоянии определить, что есть что, используя 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 возвращает «Я А», который является правдой, но вы можете иметь в виду «Я В». Ваш класс C printMe возвращает «Я a B», который не соответствует действительности и должен быть «Я C» – YoungJohn

+0

@YoungJohn: Спасибо, что указал на мою неуклюжесть. Исправлена. –

+0

@JohnDibling поблагодарить так много, но печать в классе A является «virtual void print() = 0;» , и я переопределяю его в B и C, мой вопрос здесь, как я могу определить элементы, если это из класса B или C в печати класса ** D ** ?? –

Смежные вопросы