C++类型检查错误
C++ type checking error
我按照上一篇文章中的说明重新编写了代码。
我的头文件
#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对象填充"list"向量。
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
非常感谢
多态性不是这样工作的。
如何实现您想要实现的目标
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中的CCD_ 3和CCD_。
相关文章:
- C++中的输入限制和错误检查
- 在错误检查非 int 的内容时,控制台被淹没
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 运行时与编译时多态性:更好的可读性与编译时错误检查,更重要的是
- NPP 和 CUDA 错误检查
- 在此程序中获取错误:检查两个数组是否相等
- 错误 ~ 检查字符是否为小写字母
- 同时循环到错误检查 C++
- clang format函数和错误检查在同一行
- 使用宏进行赋值和错误检查
- 在C++中将命令行字符参数解析为int并进行错误检查
- 使用 Makefiles 在 Eclipse CDT 中进行错误检查
- 数据文件处理中的错误检查是否可以打开文件 - 为什么会发生
- 通过错误检查将参数转换为整数
- 这种错误检查方法的性能会不会太高
- C++通过错误检查将sscanf代码改编为distingstream
- 在windows错误检查中使用c++向gmail帐户发送电子邮件
- C++ 卷曲文件下载 - 错误检查
- 通过错误检查将 wstring 转换为双精度的方法
- 如何使用标准库函数通过错误检查将字符串 (char*) 转换为数字