C ++类型问题 - 切片isse?

时间:2013-09-06 01:17:41

标签: types slice c++98

TourManager.h

#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <typeinfo>
#include "Tour.h"
#include "GuidedTour.h"

using namespace std;
class TourManager {

private:
    vector<Tour *> list;
    void setupTour();
    void callDisplayOnEach();

public:
    TourManager();
    void go();
};

TourManager.cpp

#include "TourManager.h"

TourManager::TourManager() {

    setupTour();
}

void TourManager::setupTour() {

    list.push_back(new Tour("BG002", "Botanical Gardens Entry Pass", 30.00));
    list.push_back(new GuidedTour("SK003", "Learn to Ski Adventure Tour", 240.00, "28/07/2008", "Zail S", 25));
}

void TourManager::callDisplayOnEach() {

    for(vector<Tour *>::iterator it = list.begin() ; it != list.end(); ++it) {

        (*(*it)).display();
    }
}

导游是巡回赛的一个分类。它会覆盖父游览类的显示方法。 但是,当我遍历巡视对象矢量并调用显示时,即使对象是GuidedTour,它也总是调用tour :: display。

我在这里做错了什么?

我正在使用C ++ 98 非常感谢。

2 个答案:

答案 0 :(得分:1)

您的display方法都必须是虚拟的,才能实现此目的。


另外,请考虑使用std::unique_ptr。原始指针永远不应该拥有内存。它对你也有好处,因为当向量超出范围时,唯一指针的析构函数将为你清除分配的内存。

没关系,C ++ 98只有std::auto_ptr。然而,Boost库有自己的智能指针。查看boost::scoped_ptr

答案 1 :(得分:0)

终于明白了。

在旅游课程中

virtual void display():

所以它可以在子类中重写:D