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()函数从未被调用,每次只调用基函数。我做错什么了?
您的代码实际上不打印任何内容,因为
当对象切片发生时,您只存储
为了解决您的问题,您需要使用(智能)指针和动态分配对象,以多态方式存储对象。
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(); } } |
注意,我使用的是
请注意,有些人可能会建议您使用
您的问题与类无关,而与您如何创建对象无关。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(); } } |