8

我有以下设置:

主.cpp:

int main()
{
    vector <Tour> tourList;
    Tour* tour_ptr;

    for (unsigned int i = 0; i < tourList.size(); i++)
    {
        tour_ptr = &tourList[i];
        tour_ptr->display();
    }
}

旅游.h:

class Tour
{
   public:
    virtual void display();
};

旅游.cpp:

void Tour::display()
{
    cout << "Tour ID: " << getID() << "\n";
    cout << "Description: " << getdescription() << "\n";
    cout << "Tour Fee: $" << getfee() << "\n";
    cout << "Total Bookings: " << getbookings() << "\n\n";
}

GuidedTour.h:

class GuidedTour : public Tour
{
    public:
            void display();
};

GuidedTour.cpp:

void GuidedTour::display()
{
    Tour::display();
    cout << "Max Tour Group Size: " << getMaxTourists() << "\n";
    cout << "Tour Guide: " << getGuideName() << "\n";
    cout << "Tour Date: " << getTourDate() << "\n\n";
}

GuidedTour 继承自 Tour 类,并且我在基础 Tour 类中将 display() 函数指定为 virtual,但由于某种原因,GuidedTour display() 函数永远不会被调用,每次只会调用基本函数。我究竟做错了什么?

4

3 回答 3

11

您的代码实际上不会打印任何内容,因为std::vector最初是空的。除此之外,您的问题是由对象切片push_back()引起的(我假设您正在将GuidedTours 放入向量中)。

进行对象切片时,您只存储对象的Tour一部分,GuidedTour这就是您看到Tour::display().

要解决您的问题,您需要通过使用(智能)指针和动态分配对象来多态地存储对象。

int main()
{
    vector <std::unique_ptr<Tour>> tourList;

    for(...) {
       tourList.push_back(std::make_unique<GuidedTour>(/* constructor parameters */));
       ...
       tourList.push_back(std::make_unique<Tour>(/* constructor parameters */));
    }

    for (unsigned int i = 0; i < tourList.size(); i++)
    {
        tourList[i]->display();
    }
}

请注意,我使用的是std::unique_ptr/std::make_unique而不是原始newed 指针。使用它们将大大减轻您手动管理和deleteing 对象的问题,这有时[轻描淡写]是导致错误和未定义行为的原因。

请注意,有些人可能会建议您使用boost::ptr_vector或类似的东西。听听他们的意见,尤其是当他们就为什么它们比替代品更好的论点时。

于 2013-09-17T05:08:47.663 回答
2

您的问题与您的类无关,而与您创建对象的方式无关。tourList 向量中的每个元素都是一个游览,在编译时或运行时没有任何东西可以确定它们是 GuidedTours。实际上,从未调用过 GuidedTour,因为我在您的 main 中的任何地方都看不到 GuidedTour 对象。

于 2013-09-17T05:07:08.613 回答
-1

我同意“It'sPete”。因为你还没有使用 GuidedTour 类。如果您使用以下方法,它将起作用。

int main()
{
  vector <GuidedTour> tourList;
  Tour* tour_ptr;

  for (unsigned int i = 0; i < tourList.size(); i++)
  {
      tour_ptr = &tourList[i];
      tour_ptr->display();
  }
}
于 2013-09-17T09:15:35.810 回答