Является ли это приведение типов в 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 лет назад, и теперь все в отпуске, так что я не могу спросить профессора, которые сделали это, но они сделали это в основном -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
}
Аннотация BaseClass: Question(string question = "");
Дети:
YesNoQuestion(string question = "", bool answer = true);
MultipleAnswerQuestion(string question, string alternatives[],
int nrOfAlternatives, int correctAnswer);
Кажется, с стиле вентиляционный. Базовый класс Question может не предоставлять этих членов. – 0lakan0
sidenote: в C++ лучше использовать dynamic_cast, поскольку он фактически выполняет некоторую проверку – 0lakan0
Еще одно побочное: это плохой стиль C++. 1. С C++ 11 вы должны использовать 'nullptr' вместо' NULL'. 2. С C++ 11 вы должны использовать 'std :: unique_ptr' вместо необработанных указателей. 3. Еще до C++ 11 отсутствует 'delete' (с помощью' std :: unique_ptr' устраняется необходимость в 'delete'). –