【问题标题】:array of objects and inheritance对象数组和继承
【发布时间】:2014-01-09 10:52:07
【问题描述】:

我有 A 类作为基类, 和 Class B , C 从 A 派生的类 并且有一个类 D 有一个类型为 A(组合)的数据成员(指向数组的指针)

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{ ........... ........... 无效打印(){ .......} };

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 类,我如何指定元素???

【问题讨论】:

  • 类 ID 是什么意思?
  • 你真的应该避免数组的原始分配。请改用std::vector
  • @richard.g 它是 B 类、C 类中的数据成员!我应该从用户那里收到它然后指定它(从 B 类或 C 类)?

标签: c++ arrays class object inheritance


【解决方案1】:

我在这里假设了几件事,特别是a 成员实际上包含指向A 子类的指针——即Bs 和Cs。

我还假设在 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"; }
};

如果您想打印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();
    }
  }
}

【讨论】:

  • 您的 B 类 printMe 返回“我是 A”,这是真的,但您的意思可能是“我是 B”。您的 C 类 printMe 返回“我是 B”,这不是真的,应该是“我是 C”
  • @JohnDibling 非常感谢你,但是 A 类中的打印是“virtual void print ()=0;” ,并且我在 B 和 C 中覆盖它,我的问题是,如果元素来自 B 类或 C 类的 D 打印,我该如何具体说明??
  • @RaiOu:好的,用我的回答作为解决实际问题的指南。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多