2013-08-30 70 views
1

我按照从我上一篇文章得到的指示并重新编写了我的代码。C++类型检查错误

我的头文件

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

然后,我有一个函数来填充旅游和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"; 
     } 
    } 
} 

但是,我似乎总是回来的旅游对象。 EG:它总是打印不导游。

如何归档多态行为?

你能请指教吗? (我是新的C++) 我使用C++ 98

非常感谢

+1

这是因为矢量类型。保持单独的矢量列表添加引导对象。 – user1502952

+0

是的,你有一个指向Tour对象的指针列表...因此引用列表总是会产生Tour *。不应该在那里推行GuidedTour * - 编译器会尝试将它们投射到Tour *,这意味着稍后会出现问题。 – HvS

+0

这是一个学校任务,我需要使用单个向量并从中检索值 –

回答

5

这不是多态性是如何工作的需要。

如何实现你试图做

dynamic_cast<T>使用RTTI来检查多态类型是否实际上是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提供了与C++ 11非常相似的shared_ptrweak_ptr

+0

我在Tour对象中有displayDetails方法。它已写在GuidedTour对象中。如何在不施放它的情况下调用这些方法?对不起,我是新来的C++和点 –

+0

你能解释这一行吗?虚拟〜Tour(){} –

+0

@Archie我已经更新了我的答案,以向您展示如何调用该函数;解释'虚拟'关键字会真的膨胀这个答案,但你可以找到很好的解释,就像http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained或http:// stackoverflow。 COM /问题/ 461203 /时使用的虚析构函数 – nijansen