none
C++ 仮想関数のoverrideが意図したものかチェックする方法 RRS feed

  • 質問

  • C#でいうところのoverride Keyword相当の仕組みを、

    C++で実現する方法やテクニックを探しています。

     

    例です。

    class Root
    {
    public:
    	void Func(){}
    };
    
    class Child1 : public Root
    {
    public:
    	virtual void Func(){}//親Classが仮想関数ではないので、Errorにしたい
    };
    
    class Child2 : public Child1
    {
    public:
    	void Func(){}//親Classが仮想関数だが、virtualがついておらず、大元の仮想関数ではないため、Errorにしたい
    };
    
    class Root2
    {
    public:
    	virtual void Func(){}
    };
    
    class Child3 : public Root2
    {
    public:
    	virtual void Func(){}//親Classが仮想関数だが、大元の仮想関数ではないため、Errorにしたい
    };
    
    

     

     体裁の問題になりますが、読み間違いを誘発することがあり、何か手が打てないか検討しています。

     

    C++でもoverride Keywordが利用できることは知っているのですが、

    機能は異なり上記を実現することが出来ません。

    また、書かなくても良い、ということもあり、

    記載漏れなどヒューマンエラーを救いきれないという状況もあります。

     

    理想とするところは、そういったミスを機械的に救えることですが、

    それも難しそうなので、少しでも理想に近づけられる仕組みやテクニックがあればと思います。

    (構文解析を行いCheckするのはCostがかかり過ぎるため、対応は困難です。)

     

    ご助言を頂ければと思います。 

    2010年10月1日 12:31

回答

  • Child3はroot2の当該関数をsealed すればいけそうな気もします
    (試してませんあしからず)が、非標準なので抵抗感がありますね。
    自分も同様の問題意識は持ってはいますが、機械的にどうこうしようと
    思うほどの危機感を感じたことはありません。現実的な対策として、
    自分はは関数の命名の運用規則で逃げてます。これだと、virtualの
    付加/削除で関数名自体が変更になってしまいますが、別に気になりません。
    • 回答としてマーク kozz 2010年10月4日 10:44
    2010年10月4日 3:29

すべての返信

  • Child3はroot2の当該関数をsealed すればいけそうな気もします
    (試してませんあしからず)が、非標準なので抵抗感がありますね。
    自分も同様の問題意識は持ってはいますが、機械的にどうこうしようと
    思うほどの危機感を感じたことはありません。現実的な対策として、
    自分はは関数の命名の運用規則で逃げてます。これだと、virtualの
    付加/削除で関数名自体が変更になってしまいますが、別に気になりません。
    • 回答としてマーク kozz 2010年10月4日 10:44
    2010年10月4日 3:29
  • 有難うございます。

    sealed + overrideの組み合わせで検討しようと思います。

    (試してみたら機能しました)

     

    命名規則よいですね。

    MethodのPrefixに、例えばV_をつけると良い感じになります。

    新規に作る場合は、命名規則にしようかな。

     

    ご助言有難うございました。

    2010年10月4日 10:44