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

Types C++;类型问题-切片isse?,types,slice,c++98,Types,Slice,C++98,旅游经理 #include <iostream> #include <string> #include <vector> #include <cstdio> #include <typeinfo> #include "Tour.h" #include "GuidedTour.h" using namespace std; class TourManager { private: vector<Tour *> li

旅游经理

#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();
};
#包括
#包括
#包括
#包括
#包括
#包括“Tour.h”
#包括“GuidedTour.h”
使用名称空间std;
班长{
私人:
向量表;
void setupTour();
void callDisplayOnEach();
公众:
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();
    }
}
#包括“TourManager.h”
TourManager::TourManager(){
setupTour();
}
void TourManager::setupTour(){
列表。推回(新游览(“BG002”,“植物园入场证”,30.00));
列表。向后推(新指南图(“SK003”,“学会滑雪冒险之旅”,240.00,“28/07/2008”,“Zail S”,25));
}
void TourManager::callDisplayOnEach(){
for(vector::iterator it=list.begin();it!=list.end();++it){
(*(*it)).display();
}
}
导游是旅游的一个子类。它覆盖父巡更类的显示方法。 但是,当我循环遍历tour objects vector并调用display时,它总是调用tour::display,即使该对象是GuidedTour

我做错了什么

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

您的两种
显示方法都必须是虚拟的才能工作


也可以考虑使用<代码> STD::UNQuYGYPTR < /代码>。原始指针永远不应该拥有内存。这对您也有好处,因为当向量超出范围时,唯一指针的析构函数将为您清除分配的内存


无论如何,C++98只有
std::auto\u ptr
。然而,Boost库有自己的智能指针。调查一下。

终于弄明白了

在旅游班

virtual void display():

因此它可以在子类中被重写:D

你的显示方法是虚拟的吗?什么是虚拟方法,对不起,我是C++新手虚拟方法是一个函数或方法,其行为可以在继承类中被同名函数重写。谢谢,你救了我一天!!什么是虚拟方法,对不起,我是C++的新ST::UnQuyQPTR,我能用C++ 98吗?谢谢,你救了我的一天!!虚拟虚空显示():在旅游类中修复了它@Mohammad Ali Baydoun实际上,“(*(*it)).display()”是有效的。(*(*it))不会生成对象,而是生成对该对象的引用巡更。而通过引用进行的虚拟函数调用也受到动态调度的影响,就像通过指针进行的调用一样。当然,“(*it)->display()”是一个很好的实践。