1

我按照上一篇文章中的说明重新编写了我的代码。

我的头文件

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

using namespace std;
class TourManager {

private:
    vector<Tour *> tours;
    void setupTour();
    string getUserInput();
    string displayMainMenu();
    void displayTourDetails();
    void callDisplayOnEach();
    void addBookingsToTour();

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

然后我有一个函数用 tour 和guidedTour 对象填充“列表”向量。

void TourManager::setupTour() {

    tours.push_back(new Tour("FP001", "Fun Park 3 Day Pass", 110.00));
    tours.push_back(new GuidedTour("SK003", "Learn to Ski Adventure Tour", 240.00, "28/07
}

void TourManager::callDisplayOnEach() {

    for (vector<Tour *>::iterator it = tours.begin() ; it != tours.end(); ++it) 
    {
        if(typeid(*it) == typeid(GuidedTour)) 
        {    
            cout << "Guided Tour" << "\n";
        }
        else 
        {
            cout << "NOT Guided Tour : " << typeid(*it).name() << "\n";
        }
    }
}

但是,我似乎总是要找回 Tour 对象。EG:它总是打印 NOT Guided Tour。

如何归档多态行为?

你能请教吗?(我是 C++ 新手)我需要使用 C++98

非常感谢

4

1 回答 1

5

这不是多态性的工作方式。

如何实现你想要做的事情

dynamic_cast<T>使用 RTTI 检查多态类型是否实际上是 type T

GuidedTour * ptr = dynamic_cast<GuidedTour *>(*it);
if(ptr != NULL)
{
    std::cout << "This is a guided tour" << '\n';
}

然而,RTTI 是有代价的。这些是在运行时执行的检查,会降低您的性能,并且可能根本不支持 RTTI。

你通常应该做什么

避免需要知道多态对象的确切类型。提供一个运行良好的接口,并依赖调用您的虚拟方法来完成这项工作。

class Tour
{
    public:
        virtual ~Tour() {}

        virtual void info() const
        {
            std::cout << "This is not a guided tour" << '\n';
        }
};

class GuidedTour : public Tour
{
    public:
        void info() const
        {
            std::cout << "This is a guided tour" << '\n';
        }
};

Tour * tour = new GuidedTour();
tour->info();
delete tour; // here you need the virtual destructor

虽然我们处于最佳实践;请避免使用原始指针。即使您绑定到 C++98,也有非常好的智能指针;例如,Boost 提供了shared_ptrweak_ptrC++11 中的非常相似的。

于 2013-08-30T09:58:05.720 回答