У меня есть класс Literal, который на самом деле является оболочкой для (const int). Я хочу иметь второй класс PositiveLiteral, который наследуется от Literal, но имеет конструктор, утверждающий, что его значение положительное.
class Literal {
public:
Literal(int x):x(x){}
virtual ~Literal(){}
// Other methods
private:
const int x;
}
class PositiveLiteral : public Literal {
public:
PositiveLiteral(int x):Literal(x) {
assert(x > 0)
}
}
Таким образом, функции, которые ожидают положительный литерал, могут просто принимать PositiveLiteral в качестве аргумента. Тогда мне не нужно вставлять в свой код явные утверждения, и, кроме того, там, где эти утверждения не работают, я сразу понимаю, почему.
В противном случае я не ожидаю наследования от Literal, за исключением этого случая. Тем не менее, поскольку существует наследование, я должен дать Literal виртуальный деструктор, чтобы избежать неопределенного поведения, которое кажется глупым, потому что у PositiveLiteral нет связанной с ним дополнительной информации, которой нет у Literal. Это просто способ поддерживать утверждение, не делая его явным.
Какой другой способ выполнить ту же задачу без необходимости использования виртуального метода в том, что должно быть простым классом-оболочкой?