派生类不使用基类中的所有纯虚方法

时间:2018-05-16 19:35:05

标签: c++ polymorphism

我有类似的情况:

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,我将无法创建该类的实例。有没有办法做我想要的或者我应该重新考虑整个设计?

2 个答案:

答案 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;
}

然后后代只能覆盖他们感兴趣的虚方法,只要它们至少覆盖其中一个,并且覆盖不会回调基类方法。否则你最终会进行递归循环。