这是类型转换吗?这是什么?
Is this typecasting? What is this?
这是 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);
指针是否提供了足够的 "identity" 来使 child class 的成员函数对 parent class 可行?
为什么还要将类型设为指针?是不是因为 Question-objects 是指针,所以新类型也必须是指针?
上下文:
这些是 5-6 年前的一次旧考试的答案,现在每个人都在放假,所以我不能问做它的教授,但他们在 main-file:
#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
}
摘要基础class:Question(string question = "");
Children:
YesNoQuestion(string question = "", bool answer = true);
MultipleAnswerQuestion(string question, string alternatives[],
int nrOfAlternatives, int correctAnswer);
这完全取决于您的 classes 是如何定义的,但我猜您的 Question
class 没有 setAnswer
方法布尔值。因为 first
是一个 Question
指针,而不是 YesOrNoQuestion
指针,所以你不能在它上面调用 YesOrNoQuestion
方法。
first
实际上指向一个 YesOrNoQuestion
对象这一事实是无关紧要的,因为编译器必须能够在编译时纯粹根据变量的类型来确定调用是否有效.
在您的示例中,您可以简单地将 first
设为 YesOrNoQuestion
指针以避免强制转换。在更复杂的情况下,可能就没那么简单了。
这是一种用于多态性的类型转换。您提出的第一个替代方案只有在基础 class Question
具有 setAnswer
、setAlternative
和 setCorrectAlternative
的虚拟方法时才有效。如果不是,那么您必须将指针转换为好的 class 才能找到该方法。第二种选择不起作用,因为 first
和 second
是指针,因此它们的值是地址。将这些地址解释为 class 的对象本身没有意义。
(Type*)
通常被称为 C 风格转换,这基本上是从 const_cast
、static_cast
、reinterpret_cast
中选择一个。我不喜欢最后一个,所以我会使用其中一个。
转换完成的原因很可能是因为 Question
不包含正在调用的方法。为什么通用问题会有一个接受布尔值的 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 Q
这是 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);
指针是否提供了足够的 "identity" 来使 child class 的成员函数对 parent class 可行?
为什么还要将类型设为指针?是不是因为 Question-objects 是指针,所以新类型也必须是指针?
上下文:
这些是 5-6 年前的一次旧考试的答案,现在每个人都在放假,所以我不能问做它的教授,但他们在 main-file:
#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
}
摘要基础class:Question(string question = "");
Children:
YesNoQuestion(string question = "", bool answer = true);
MultipleAnswerQuestion(string question, string alternatives[],
int nrOfAlternatives, int correctAnswer);
这完全取决于您的 classes 是如何定义的,但我猜您的 Question
class 没有 setAnswer
方法布尔值。因为 first
是一个 Question
指针,而不是 YesOrNoQuestion
指针,所以你不能在它上面调用 YesOrNoQuestion
方法。
first
实际上指向一个 YesOrNoQuestion
对象这一事实是无关紧要的,因为编译器必须能够在编译时纯粹根据变量的类型来确定调用是否有效.
在您的示例中,您可以简单地将 first
设为 YesOrNoQuestion
指针以避免强制转换。在更复杂的情况下,可能就没那么简单了。
这是一种用于多态性的类型转换。您提出的第一个替代方案只有在基础 class Question
具有 setAnswer
、setAlternative
和 setCorrectAlternative
的虚拟方法时才有效。如果不是,那么您必须将指针转换为好的 class 才能找到该方法。第二种选择不起作用,因为 first
和 second
是指针,因此它们的值是地址。将这些地址解释为 class 的对象本身没有意义。
(Type*)
通常被称为 C 风格转换,这基本上是从 const_cast
、static_cast
、reinterpret_cast
中选择一个。我不喜欢最后一个,所以我会使用其中一个。
转换完成的原因很可能是因为 Question
不包含正在调用的方法。为什么通用问题会有一个接受布尔值的 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 Q