C++ 类型问题 - 切片



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

旅游经理.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();
    }
}

导游是旅游的一个子类。它覆盖父游览类的显示方法。但是,当我循环遍历游览对象矢量并调用显示时,它总是调用 tour::d isplay,即使对象是 GuidedTour。

我在这里做错了什么?

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

您的两种display方法都必须是虚拟的才能正常工作。


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

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

终于想通了。

在旅游类中

virtual void display():

因此可以在子类中覆盖它:D

最新更新