首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是打字吗?这是什么?

这是打字吗?这是什么?
EN

Stack Overflow用户
提问于 2016-08-14 15:50:39
回答 3查看 72关注 0票数 0

这是C++中的类型转换,还是我看到的东西?

代码语言:javascript
复制
    ((YesNoQuestion*)first)->setAnswer(false);
    ((MultipleAnswerQuestion*)second)->setAlternative(2, "City2");
    ((MultipleAnswerQuestion*)second)->setCorrectAlternative(2);

为什么这样做而不是仅仅

代码语言:javascript
复制
    first->setAnswer(false);
    second->setAlternative(2, "City2");
    second->setCorrectAlternative(2);

代码语言:javascript
复制
    ((YesNoQuestion)first)->setAnswer(false);
    ((MultipleAnswerQuestion)second)->setAlternative(2, "City2");
    ((MultipleAnswerQuestion)second)->setCorrectAlternative(2);

指针不提供足够的“标识”来使子类的成员函数对父类可行吗?

为什么还要做类型指针呢?是因为问题对象是指针,新类型也必须是指针吗?

上下文:

这些是5-6年前的一次旧考试的答案,现在每个人都在休假,所以我不能问是谁做的,但他们主要是这样做的:

代码语言:javascript
复制
#include "MultipleAnswerQuestion.h"
#include "YesNoQuestion.h"

int main()
{
    Question *first = NULL;
    Question *second = NULL;

    string alt[] = {"City1", "City2", "City3"};
    first = new YesNoQuestion("Some statement here");
    second = new MultipleAnswerQuestion("Some question here", alt, 3, 0);

    ((YesNoQuestion*)first)->setAnswer(false);
    ((MultipleAnswerQuestion*)second)->setAlternative(2, "City2");
    ((MultipleAnswerQuestion*)second)->setCorrectAlternative(2);

    first->print(); //Prints Q
    second->print(); //Prints Q

}

抽象基Question(string question = "");

儿童

代码语言:javascript
复制
YesNoQuestion(string question = "", bool answer = true);

MultipleAnswerQuestion(string question, string alternatives[], 
                       int nrOfAlternatives, int correctAnswer);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-14 15:56:55

这是一种用于多态性的类型转换。您提出的第一个替代方案只有在基类Question具有用于setAnswersetAlternativesetCorrectAlternative的虚拟方法时才能起作用。如果没有,则必须将指针转换为好类才能找到该方法。第二种选择不起作用,因为firstsecond是指针,因此它们的值是地址。将这些地址解释为类的对象本身是没有意义的。

票数 0
EN

Stack Overflow用户

发布于 2016-08-14 15:54:16

这完全取决于如何定义类,但我猜想您的Question类没有接受bool的setAnswer方法。因为first是一个Question指针,而不是YesOrNoQuestion指针,所以您不能在它上调用YesOrNoQuestion方法。

first实际上指向YesOrNoQuestion对象这一事实与此无关,因为编译器必须能够在编译时确定调用是否有效,这完全取决于变量的类型。

在您的示例中,您可以简单地使first成为一个YesOrNoQuestion指针,以避免转换。在更复杂的情况下,情况可能不那么简单。

票数 1
EN

Stack Overflow用户

发布于 2016-08-14 16:00:32

(Type*)通常被称为C型铸造,这基本上是从const_caststatic_castreinterpret_cast中选择一个.我不喜欢最后一个,所以我会用其中一个。

转换完成的原因很可能是因为Question不包含正在调用的方法。为什么一个通用问题会有一个接受bool的setAnswer()

在这种情况下,我会编写如下内容:

代码语言:javascript
复制
YesNoQuestion *firstTyped = new YesNoQuestion("Some statement here");
MultipleAnswerQuestion *secondTyped = new MultipleAnswerQuestion("Some question here", alt, 3, 0);

Question *firstUntyped = firstTyped;
Question *secondUntyped = secondTyped;    

firstTyped->setAnswer(false);
secondTyped->setAlternative(2, "City2");
secondTyped->setCorrectAlternative(2);

firstUntyped->print(); //Prints Q
secondUntyped->print(); //Prints Q
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38943893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档