C++ C++;未调用重写的虚拟函数

C++ C++;未调用重写的虚拟函数,c++,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.cpp: void Tour::d

我有以下设置:

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.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.cpp:

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

cout您的问题与您的类无关,而与您如何创建对象无关。tourList向量中的每个元素都是一个tour,在编译时或运行时都无法确定它们是否为GuidedTour。实际上,GuidedTour从未被调用,因为我在main中的任何地方都看不到GuidedTour对象。

ode实际上不打印任何内容,因为
std::vector
最初是空的。除此之外,您的问题是由对象切片造成的(我假设您是
push_back()
ing
GuidedTour
s进入向量)

当对象切片发生时,您只存储
GuidedTour
对象的
Tour
部分,这就是您看到
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();
    }
}
intmain()
{
矢量旅游列表;
对于(…){
tourList.push_back(标准::使_唯一(/*构造函数参数*/);
...
tourList.push_back(标准::使_唯一(/*构造函数参数*/);
}
for(无符号整数i=0;idisplay();
}
}
请注意,我使用的是
std::unique_ptr
/
std::make_unique
而不是原始的
新的
ed指针。使用它们可以极大地缓解手动管理和
删除对象的问题,有时[轻描淡写]会导致错误和未定义的行为

请注意,有些人可能会建议您使用
boost::ptr_vector
或类似的方法。请倾听他们的意见,尤其是当他们向您解释为什么他们比其他方法更好时。

我同意“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();
  }
}
intmain()
{
矢量旅游列表;
旅游*旅游ptr;
for(无符号整数i=0;i显示();
}
}

在向量中,你应该存储Tour*而不是Tour的实例,否则你不能在其中存储GuidedTour的实例。你正在遭受切片的痛苦。你的GuidedTour在放入向量时被切片为一个Tour。所以我在谷歌上搜索了“对象切片”显然,解决方案是使基类纯虚拟。这对我来说不是一个选项,因为我需要能够实例化基类的对象。我还有什么其他选项?这不是解决方案。解决方案不是按值向下转换对象。@user2742003:the
vector
保存
Tour
对象。它无法保存
GuidedTour
对象,因此如果将其中一个对象推入向量,它会将巡视部分切掉并放入向量中。如果要在向量中保存多态对象,则需要使用指针
std::vector
,或者最好使用
boost::ptr_vector
我实际上删除了我推送的巡视和向导对象_回到上面例子中的向量,以节省空间并使其更具可读性。啊,那么,请看马克的答案。推上一列游览队伍,你就是在剥离引导对象的四个部分。谢谢你的帮助。
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();
    }
}
int main()
{
  vector <GuidedTour> tourList;
  Tour* tour_ptr;

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