参见英文答案 >
What is object slicing?17个
我有以下设置:
我有以下设置:
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()函数永远不会被调用,每次只调用基函数.我究竟做错了什么?
解决方法
您的代码实际上不会打印任何内容,因为std :: vector最初会为空.除此之外,你的问题是由对象切片引起的(我假设你是push_back()将GuidedTours引入向量).
当对象切片发生时,您只存储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(); } }
请注意,我使用的是std :: unique_ptr / std :: make_unique而不是raw newed指针.使用它们可以大大简化您手动管理和删除对象的问题,有时候[轻描淡写]是导致错误和未定义行为的原因.
请注意,有些人可能会建议您使用boost :: ptr_vector或类似的东西.听取他们的意见,特别是如果他们为你提供有关为什么他们比替代品更好的论据.