C ++重写的虚函数未被调用

时间:2013-09-17 05:01:55

标签: c++

我有以下设置:

main.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();
    }
}

Tour.h:

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

Tour.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()函数指定为虚函数,但由于某种原因,GuidedTour display()函数永远不会被调用,只有每个函数调用基函数时间。我做错了什么?

3 个答案:

答案 0 :(得分:9)

您的代码实际上并没有打印任何内容,因为std::vector最初会为空。除此之外,您的问题是由对象切片引起的(我假设您push_back() GuidedTour进入了向量)。

当进行对象切片时,您只存储Tour个对象的GuidedTour部分,这就是您看到{{1}的输出的原因}}

要解决您的问题,您需要以多态方式存储对象,方法是使用(智能)指针并动态分配对象。

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指针。使用它们可以极大地轻松解决手动管理和new对象的问题,有时 [understatement] 是导致错误和未定义行为的原因。

请注意,有些人可能会建议您使用delete或类似内容。听取他们的意见,特别是如果他们为你提供关于他们为什么比其他选择更好的论据。

答案 1 :(得分:2)

您的问题与您的课程无关,而是您如何创建对象。 tourList向量中的每个元素都是一个游览,在编译时或运行时没有任何元素可以确定它们是GuidedTours。实际上,从不调用GuidedTour,因为我在主处找不到GuidedTour对象。

答案 2 :(得分:-1)

我同意“ItPete”。因为你没有使用过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();
  }
}