如何调用特定于C ++子类的方法

时间:2013-10-09 12:24:05

标签: c++ types

您好我有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 个答案:

答案 0 :(得分:2)

您可以添加

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

进入Class Tour并在GuidedTour中创建GetDate虚拟。 你也可以演员:

dynamic_cast<GuidedTour*>(t)->GetDate()

答案 1 :(得分:2)

这里有两个问题。一个句法的,其他的答案已经为你找到了解决方案,以及一个没有人解决的设计缺陷。

语法问题是由Tour确实没有getDate方法的事实引起的。然而你试图调用这个函数:

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

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

您知道对象的 dynamic 类型实际上是GuidedTour,但编译器不知道。所有编译器都知道t是指向Tour的指针。

有许多方法可以解决编译器知道的内容与您所知道的内容之间的差异。

一个是让getDate()成为Tour的成员 - 但如果您希望getDate()成为Tour的成员,那么您可能会以这种方式设计它首先。

另一个是告诉编译器你知道它不知道的东西 - t实际指向GuidedTour。您可以使用dynamic_cast执行此操作。但是如果你知道编译器不知道的东西,通常不是,因为编译器是愚蠢的,但是因为你的设计有问题 - 这是你的第二个问题。这就是为什么我通常会说如果你的程序中有dynamic_cast,你应该仔细看看你的设计,因为这通常表明存在设计缺陷。使用dynamic_cast时也存在潜在的性能问题,虽然它们可能很大,但在我看来,它们仍然不是dynamic_cast的主要问题。

答案 2 :(得分:0)

问题在于你宣布t为巡回赛。 即使您稍后将其设置为GuidedTour,Tour也没有getDate()函数,因此错误。 您可以先将其作为GuidedTour调用来调用它:

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

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

答案 3 :(得分:-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'课程的私人部分。

相关问题