0

嗨,我有一Tour堂课,GuidedTour它扩展了Tour。我正在对我的代码进行以下操作:

Tour* t;

if(x) {

    t = new Tour(...);
}
else {

    t = new GuidedTour(...);
}

但是,当我执行以下操作时,

t->getDate();

getDate()特定于GuidedTour班级)

我收到以下错误

'class Tour' has no member named 'getDate'

我怎么能调用这个方法?

4

4 回答 4

2

你可以加

virtual Date GetDate() { throw std::exception("unimplemented"); }

进入类 Tour 并在 GuidedTour 中将 GetDate 设为虚拟。您还可以投射:

dynamic_cast<GuidedTour*>(t)->GetDate()
于 2013-10-09T12:27:22.547 回答
2

你这里有两个问题。一个语法问题,其他答案已经为您解决了问题,还有一个没有人解决的设计缺陷。

句法问题是由于事实上Tour没有getDate方法造成的。然而你正试图调用这个函数:

Tour* t;
// ... MAGIC HAPPENS
t->getDate(); // ERROR 

这段代码告诉编译器“我有一个指向 Tour 对象的指针。调用它的 getDate() 方法。” 但是编译器说,“嗯,Tour 没有 getDate() 方法。”

您知道对象的动态类型实际上是 a GuidedTour,但编译器不知道这一点。编译器只知道这t是一个指向 a 的指针Tour

有很多方法可以解决编译器知道的和你知道的之间的差异。

一个是成为其中的getDate()一员Tour——但如果您想getDate()成为其中的一员,Tour那么您可能一开始就会这样设计它。

另一个是告诉编译器你知道一些它不知道的东西——它t实际上指向一个GuidedTour. 您使用dynamic_cast. 但是如果你知道一些编译器不知道的东西,那通常不是因为编译器很笨,而是因为你的设计有问题——这是你的第二个问题。这就是为什么我通常说如果你dynamic_cast的程序中有一个,你应该仔细看看你的设计,因为这通常表明存在设计缺陷。使用dynamic_castand 也有潜在的性能考虑,虽然它们可能很重要,但在我看来,它们仍然不是dynamic_cast.

于 2013-10-09T13:17:38.567 回答
0

问题在于您将 t 声明为 Tour。即使您稍后将其实例化为 GuidedTour,Tour 也没有 getDate() 函数,因此会出现错误。您可以先将其转换为 GuidedTour 来调用它:

GuidedTour *tAsGuidedTour = dynamic_cast<GuidedTour*>(t)
if (tAsGuidedTour != NULL)
{
   tAsGuidedTour->getDate();
}

编辑:您可以阅读http://www.cplusplus.com/doc/tutorial/typecasting/以获得更好的理解

于 2013-10-09T12:33:04.400 回答
-1

样本:

#include"stdio.h"
class Tour
{
public:
    Tour(){}
    ~Tour(){}
    int getDate()
    {
        printf("Func Display!\n");
        return 0;
    }
private:
    ///
};
class GuidedTour:public Tour
{
public:
    GuidedTour(){}
    ~GuidedTour(){}
private:
    ///
};
int main()
{
    int x;
    Tour *t;
    scanf("%d",&x);
    if(x) t=new Tour;
    else t=new GuidedTour;
    t->getDate();
    return 0;
}

也许您扩展了“Tour”课程的私人部分。

于 2013-10-09T12:57:28.180 回答