是这种类型转换吗?这是什么?

时间:2016-08-14 15:50:39

标签: c++ pointers language-agnostic

这是用C ++进行类型转换还是我看到的东西?

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

为什么要这样做而不仅仅是

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

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

指针是否提供了足够的"标识"使子类的成员函数对于父类是否可行?

为什么还要制作类型指针呢?是因为Question-objects是指针,新类型也必须是指针?

上下文:

这些是5 - 6年前的旧考试的答案,现在每个人都在度假,所以我不能问教授谁,但是他们在主文件中这样做了:

#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 = "");

儿童

YesNoQuestion(string question = "", bool answer = true);

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

3 个答案:

答案 0 :(得分:1)

这取决于您的类的确切定义,但我猜测您的Question类没有采用bool的setAnswer方法。由于firstQuestion指针,而不是YesOrNoQuestion指针,因此您无法在其上调用YesOrNoQuestion方法。

first实际上指向YesOrNoQuestion对象的事实是无关紧要的,因为编译器必须能够在编译时确定调用是否纯粹基于变量的类型。< / p>

在您的示例中,您只需将first设为YesOrNoQuestion指针即可避免投射。在更复杂的情况下,可能不那么简单。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

(Type*)通常被称为C风格的投射,这基本上选自:const_caststatic_castreinterpret_cast。我不喜欢最后一个,所以我会使用其中一个。

完成转换的原因很可能是因为Question不包含被调用的方法。为什么一般性问题的setAnswer()接受bool?

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

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