2013-12-20 154 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 **? –