3

我有以下两个类,一个继承自另一个

Class A{
  void print(){cout << "A" << endl;}
}

Class B : A{
  void print(){cout << "B" << endl;}
}
Class C : A{
  void print(){cout << "C" << endl;}
}

然后在另一堂课中,我有以下内容:

vector<A> things;
if (..)
  things.push_back(C());
else if (..)
 things.push_back(B());

things[0].print();

这总是打印 A
我希望它打印 B 或 C 取决于我添加到向量中的内容
我该怎么做?
我尝试过抽象,但我不完全确定如何在 C++ 中使用它,而且它对我没有用

4

3 回答 3

8

1)您需要在 A 类中将 print() 声明为虚拟。

2) 你的向量不正确——你不能在那里存储实际的 A 类对象;您将需要存储指向它们的指针以获得正确的行为(稍后您必须清理它们)和/或使用类似 boost::shared_ptr 的东西。

于 2010-03-06T00:47:32.427 回答
8

如前所述,您需要virtual启用多态行为的函数,并且不能在vector.

当您使用 astd::vector<A>时,您是按值存储的,因此您添加的对象(例如 via push_back())被复制到 an 的实例中A,这意味着您将丢失对象的派生部分。这个问题被称为对象切片

正如已经建议的那样,您可以通过将指针(或智能指针)存储到基类来避免这种情况,因此只有指针被复制到vector

std::vector<A*> things;
things.push_back(new B());
// ... use things:
things[0]->print();

// clean up later if you don't use smart pointers:
for(std::vector<A*>::iterator it = things.begin(); it != things.end(); ++it)
    delete *it;
于 2010-03-06T01:05:00.013 回答
3

您需要在基类中声明函数 virtual ,在本例中为 a 类:

class A{
  virtual void print(){cout << "A" << endl;}
}

即使您没有在这些课程中编写 virtual (但您可以),其他课程也会选择这一点。

Virtual 告诉编译器该函数可以被覆盖。正如您所发现的,当您不使用虚拟时,它被称为隐藏并且工作方式不同。

于 2010-03-06T00:47:03.007 回答