C被覆盖的虚函数未被调用

C被覆盖的虚函数未被调用,第1张

概述参见英文答案 > What is object slicing?                                    17个 我有以下设置: main.cpp中: int main(){ vector <Tour> tourList; Tour* tour_ptr; for (unsigned int i = 0; i < tourList.size( 参见英文答案 > 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或类似的东西.听取他们的意见,特别是如果他们为你提供有关为什么他们比替代品更好的论据.

总结

以上是内存溢出为你收集整理的C被覆盖的虚函数未被调用全部内容,希望文章能够帮你解决C被覆盖的虚函数未被调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1257026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存