加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:36:30 所属栏目:百科 来源:网络整理
导读:参见英文答案 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{ p
参见英文答案 > 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() << "nn";
}

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() << "nn";
}

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或类似的东西.听取他们的意见,特别是如果他们为你提供有关为什么他们比替代品更好的论据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读