gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:40:08 24 4
gpt4 key购买 nike

您好,我有一个 Tour 类和扩展 TourGuidedTour。我正在对我的代码进行以下操作:

Tour* t;

if(x) {

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

t = new GuidedTour(...);
}

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

t->getDate();

(getDate() 特定于 GuidedTour 类)

出现以下错误

'class Tour' has no member named 'getDate'

如何调用这个方法?

最佳答案

这里有两个问题。一个句法问题,其他答案都试图绕过你,还有一个没有人解决的设计缺陷。

句法问题是由以下事实引起的,事实上,Tour没有 getDate方法。然而你正在尝试调用这个函数:

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

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

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

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

一个是制作getDate() Tour的成员-- 但如果你想要 getDate()成为Tour的成员那么您可能首先会以这种方式设计它。

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

关于c++ - 如何调用特定于 C++ 子类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com