我有以下设置:
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()函数永远不会被调用,只有每个函数调用基函数时间。我做错了什么?
答案 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();
}
}