这是用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);
答案 0 :(得分:1)
这取决于您的类的确切定义,但我猜测您的Question
类没有采用bool的setAnswer
方法。由于first
是Question
指针,而不是YesOrNoQuestion
指针,因此您无法在其上调用YesOrNoQuestion
方法。
first
实际上指向YesOrNoQuestion
对象的事实是无关紧要的,因为编译器必须能够在编译时确定调用是否纯粹基于变量的类型。< / p>
在您的示例中,您只需将first
设为YesOrNoQuestion
指针即可避免投射。在更复杂的情况下,可能不那么简单。
答案 1 :(得分:0)
这是一种用于多态的类型转换。您提出的第一个备选方案仅在基类Question
具有setAnswer
,setAlternative
和setCorrectAlternative
的虚拟方法时才有效。如果没有,那么你必须将指针转换为良好类,以便找到方法。第二种选择不起作用,因为first
和second
是指针,因此它们的值是地址。将这些地址解释为类的对象本身就没有意义。
答案 2 :(得分:0)
(Type*)
通常被称为C风格的投射,这基本上选自:const_cast
,static_cast
,reinterpret_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