C++ 对象数组与继承

C++ 对象数组与继承,c++,arrays,class,object,inheritance,C++,Arrays,Class,Object,Inheritance,我有甲级作为基础课, 以及B类、C类从A派生的类 还有D类,它有一个类型为a(组合)的数据成员(指向数组的指针) 我有一个Print方法,在它的主体中,我有一个给定ID的特定元素(如果它来自类B或C)(B和C都有一个数据成员ID),Print函数中应该有两个选项。。B类打印元件,还是C类打印元件? 我如何指定元素 我把课堂抽象化了 enter code here class A{ ....... virtual void print ()=0; }; class B :public A{ ..

我有甲级作为基础课, 以及B类、C类从A派生的类 还有D类,它有一个类型为a(组合)的数据成员(指向数组的指针)

我有一个Print方法,在它的主体中,我有一个给定ID的特定元素(如果它来自类B或C)(B和C都有一个数据成员ID),Print函数中应该有两个选项。。B类打印元件,还是C类打印元件? 我如何指定元素

我把课堂抽象化了

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

class B :public A{
........
........
void print(){
.......}
};
C类:公共A类{ ........ ........ 作废打印(){ .......} };

D类{
........
.......
作废打印()
INTP;
coutprint();}

我这里的问题是,如果元素来自类B或C,我如何指定它?

我在这里假设了一些事情,特别是
a
成员实际上包含指向
a
子类的指针,也就是说,
B
s和
C
s

我还假设在
print
方法中,当您遍历这个数组时,您不知道哪个是哪个

如果您不关心哪个是哪个,只想打印对象的属性,不管它们是什么类型,那么您可以在
a
中提供一个纯
virtual
方法,该方法返回一个
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\u cast
确定哪个是哪个。由于以这种方式对多态类型使用
dynamic\u cast
,因此需要确保
A
至少有一个
virtual
函数。但是这是可以的,因为
A
是在抽象层次结构中使用的,所以无论如何都应该有一个
virtual
析构函数,这就足够了

class A
{
public:
  virtual ~A() {};
};
现在您可以使用
dynamic\u 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();
    }
  }
}
void A::print()
{
对于(大小i=0;iprintObj();
}
}
}

你所说的类ID是什么意思?你真的应该避免数组的原始分配。改用a
std::vector
。@richard.g它是B类和C类中的数据成员!我应该从用户那里收到它,然后指定它(从B类或C类)?您的B类printMe返回“我是A”,这是真的,但您的意思可能是“我是B”。你的C类printMe返回“I'm a B”,这不是真的,应该是“I'm a C”@johndilling非常感谢你,但是类a中的打印是“virtual void print()=0;”,我在B和C中重写了它,我的问题是,如果它来自类D的打印中的B或C,我如何指定元素??@rayou:OK,用我的答案作为解决实际问题的指南。
class A
{
public:
  virtual ~A() {};
};
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();
    }
  }
}