我有类似的情况:
class Question{
virtual double getPoints(double userAnswer) const = 0;
virtual double getPoints(const std::string & userAnswer) const = 0;
.
.
};
class QText : public Question{
double getPoints(const std::string & userAnswer) const;
.
.
};
class QNumeric : public Question{
double getPoints(double userAnswer) const;
.
.
};
我需要能够做到这样的事情:
std::vector<Question*> quiz;
quiz.push_back(new QText(..));
quiz.push_back(new QNumeric(..));
quiz[0]->getPoints(..);
quiz[1]->getPoints(..);
我理解如果我没有在派生类中实现纯虚函数,那么该类将是abstact,我将无法创建该类的实例。有没有办法做我想要的或者我应该重新考虑整个设计?
答案 0 :(得分:2)
是的,您应该重新考虑设计。在当前状态下,此设计会中断Interface Segregation Principle,因为QText
需要实现getPoints(double userAnswer)
,它并不需要,而QNumeric
需要实现getPoints(const std::string& userAnswer)
,它并不需要。
答案 1 :(得分:2)
要做你要问的事,不要让你的虚拟方法变得抽象。在基类中给出它们的默认实现,例如:
class Question
{
virtual double getPoints(double userAnswer) const;
virtual double getPoints(const std::string & userAnswer) const;
...
};
double Question::getPoints(double userAnswer) const
{
return getPoints(std::to_string(userAnswer));
}
double Question::getPoints(const std::string & userAnswer) const
{
std::istringstream iss(userAnswer);
double dblAnswer;
return (iss >> dblAnswer) ? getPoints(dblAnswer) : 0.0;
}
然后后代只能覆盖他们感兴趣的虚方法,只要它们至少覆盖其中一个,并且覆盖不会回调基类方法。否则你最终会进行递归循环。