你这里有两个问题。一个语法问题,其他答案已经为您解决了问题,还有一个没有人解决的设计缺陷。
句法问题是由于事实上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_cast
and 也有潜在的性能考虑,虽然它们可能很重要,但在我看来,它们仍然不是dynamic_cast
.