我有A类作为基类, 来自A的B类和C类派生类 并且D类具有类型A(组合)
的数据成员(指向Array的指针)enter code here
class D{
A **a;
int size;
.......
a = new A*[size];
......
};
我有Print方法,在它的主体中我必须具有给定ID的特定元素(如果它来自B类或C类)(B和C都有数据成员ID)在print函数中应该有2个选项。 。打印B类元素,或C类打印元素? 我该如何具体说明这些要素?
我做了A级摘要!!
enter code here
class A{
.......
virtual void print ()=0;
};
class B :public A{
........
........
void print(){
.......}
};
C类:公开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 :(得分:2)
我在这里假设了几件事,特别是a
成员实际上包含指向A
的子类的指针 - 即B
s和{{1} }第
我也假设你在C
方法中迭代这个数组,你不知道哪个是哪个。
如果你不关心哪个是哪个而只是想打印对象的属性而不管它们是什么类型,那么你可以在print
中提供一个纯virtual
方法,它返回一个{您希望A
{1}}(或其他),并在迭代中调用该方法:
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"; }
};
类型的对象,那么您需要能够确定哪个使用{{1} }。由于B
以这种方式only works使用多态类型,因此您需要确保C
至少有一个dynamic_cast
函数。但是这没关系因为,因为dynamic_cast
正在抽象层次结构中使用,所以你真的应该有一个A
析构函数,这就足够了。
virtual
现在您可以使用A
:
virtual