这是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);指针不提供足够的“标识”来使子类的成员函数对父类可行吗?
为什么还要做类型指针呢?是因为问题对象是指针,新类型也必须是指针吗?
上下文:
这些是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);发布于 2016-08-14 15:56:55
这是一种用于多态性的类型转换。您提出的第一个替代方案只有在基类Question具有用于setAnswer、setAlternative和setCorrectAlternative的虚拟方法时才能起作用。如果没有,则必须将指针转换为好类才能找到该方法。第二种选择不起作用,因为first和second是指针,因此它们的值是地址。将这些地址解释为类的对象本身是没有意义的。
发布于 2016-08-14 15:54:16
这完全取决于如何定义类,但我猜想您的Question类没有接受bool的setAnswer方法。因为first是一个Question指针,而不是YesOrNoQuestion指针,所以您不能在它上调用YesOrNoQuestion方法。
first实际上指向YesOrNoQuestion对象这一事实与此无关,因为编译器必须能够在编译时确定调用是否有效,这完全取决于变量的类型。
在您的示例中,您可以简单地使first成为一个YesOrNoQuestion指针,以避免转换。在更复杂的情况下,情况可能不那么简单。
发布于 2016-08-14 16:00:32
(Type*)通常被称为C型铸造,这基本上是从const_cast,static_cast,reinterpret_cast中选择一个.我不喜欢最后一个,所以我会用其中一个。
转换完成的原因很可能是因为Question不包含正在调用的方法。为什么一个通用问题会有一个接受bool的setAnswer()?
在这种情况下,我会编写如下内容:
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 Qhttps://stackoverflow.com/questions/38943893
复制相似问题