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


C++ overridden virtual function not getting called

本问题已经有最佳答案,请猛点这里访问。

我有以下设置:

MCP.CPP:

1
2
3
4
5
6
7
8
9
10
11
int main()
{
    vector <Tour> tourList;
    Tour* tour_ptr;

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

旅游:

1
2
3
4
5
class Tour
{
   public:
    virtual void display();
};

Tour.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
void Tour::display()
{
    cout <<"Tour ID:" << getID() <<"
"
;
    cout <<"Description:" << getdescription() <<"
"
;
    cout <<"Tour Fee: $" << getfee() <<"
"
;
    cout <<"Total Bookings:" << getbookings() <<"

"
;
}

GuidedTour:H:

1
2
3
4
5
class GuidedTour : public Tour
{
    public:
            void display();
};

GuidedTour.cpp:

1
2
3
4
5
6
7
8
9
10
11
void GuidedTour::display()
{
    Tour::display();
    cout <<"Max Tour Group Size:" << getMaxTourists() <<"
"
;
    cout <<"Tour Guide:" << getGuideName() <<"
"
;
    cout <<"Tour Date:" << getTourDate() <<"

"
;
}

guidedtour继承自tour类,我在基本tour类中将display()函数指定为virtual,但出于某种原因,guidedtour display()函数从未被调用,每次只调用基函数。我做错什么了?


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

当对象切片发生时,您只存储GuidedTour对象的Tour部分,这就是您看到Tour::display()输出的原因。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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_ptrstd::make_unique,而不是原始newed指针。使用它们将极大地缓解手动管理和delete操作对象的问题,这些对象有时是导致错误和未定义行为的原因。

请注意,有些人可能会建议您使用boost::ptr_vector或类似的工具。听他们说,尤其是当他们给你解释为什么他们比其他选择更好的时候。


您的问题与类无关,而与您如何创建对象无关。TourList向量中的每个元素都是一个巡更,在编译时或运行时没有任何元素可以确定它们是被引导的。实际上,guidedtour从未被调用,因为我在您的主目录中的任何地方都看不到guidedtour对象。


我同意"它"的说法。因为你还没用过指导你的课。如果您使用以下方法,它将工作。

1
2
3
4
5
6
7
8
9
10
11
int main()
{
  vector <GuidedTour> tourList;
  Tour* tour_ptr;

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