0

(const int) の単なるラッパーであるクラス Literal があります。Literal から継承する 2 番目のクラス PositiveLiteral が必要ですが、その値が正であることをアサートするコンストラクターがあります。

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 を引数として取ることができます。そうすれば、明示的なアサーションをコードに入れる必要がなくなります。さらに、それらのアサーションが失敗する場合は、その理由がすぐにわかります。

この 1 つのケースを除いて、Literal から継承することは期待していません。それでも、継承があるため、PositiveLiteral には Literal にはない余分な情報が関連付けられていないため、ばかげているように見える未定義の動作を避けるために、Literal に仮想デストラクタを指定する必要があります。これは、明示的にせずにアサーションを維持する方法にすぎません。

単純なラッパー クラスであるはずの仮想メソッドを必要とせずに、同じタスクを達成する別の方法は何ですか?

4

1 に答える 1