C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: クラステンプレートの基底クラスを抽象クラスにしてもよいか?


(過去ログ 125 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■74367 / inTopicNo.1)  クラステンプレートの基底クラスを抽象クラスにしてもよいか?
  
□投稿者/ キム (29回)-(2014/12/19(Fri) 21:14:04)

分類:[C/C++] 

Visual C++ 2010 / Windows 7

お世話になります。
引き継いだコードで下記のようなコードを発見しました。
クラステンプレートの基底クラスが抽象クラスとなっています。
クラステンプレートの基底クラスが抽象クラスであってはならないと記憶していたのですが、
JIS X3014:2003 をざっと読んだところそのような記述はありませんでした。

私の勘違いであればいいのですが、下記コードは仕様的に正しいのでしょうか?
ご教示いただけると嬉しいです。
よろしくお願いします。

    class TestBase
    {
    public:
        virtual ~TestBase()
        {
        }
        virtual int FuncA() const = 0;
        virtual void FuncB() = 0;
        virtual bool FuncC() = 0;
    };

    template <typename T>
    class TestImpl : public TestBase
    {
    public:
        explicit TestImpl(T* p) : p_(p) { }

        virtual ~TestImpl()        { /* 実装... */ }

        virtual int  FuncA() const { /* 実装... */ }
        virtual void FuncB()       { /* 実装... */ }
        virtual bool FuncC()       { /* 実装... */ }

    private:
        TestImpl(const TestImpl& rhs);                      // コピー禁止
        const TestImpl& operator =(const TestImpl& rhs);    // 代入禁止
        
        T* p_;
    };

引用返信 編集キー/
■74373 / inTopicNo.2)  Re[1]: クラステンプレートの基底クラスを抽象クラスにしてもよいか?
□投稿者/ Atata!! (4回)-(2014/12/19(Fri) 23:47:16)
回答ではありません。

ATLはそのようなクラスばかりで構成されています。

ISupportErrorInfo : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE InterfaceSupportsErrorInfo( 
        /* [in] */ __RPC__in REFIID riid) = 0;

};

template <const IID* piid>
class ATL_NO_VTABLE ISupportErrorInfoImpl : 
    public ISupportErrorInfo


# 仕様から外れていたとしてもVC++がそうなんだから、
# VC++でコンパイルする限りはいいんじゃないの・・・って気がします。

引用返信 編集キー/
■74382 / inTopicNo.3)  Re[1]: クラステンプレートの基底クラスを抽象クラスにしてもよいか?
□投稿者/ επιστημη (117回)-(2014/12/20(Sat) 14:18:09)
> 私の勘違いであればいいのですが、下記コードは仕様的に正しいのでしょうか?

「クラステンプレートの基底クラスが抽象クラスであってはならない」
合理的な理由が見当たらんのですが。

引用返信 編集キー/
■74389 / inTopicNo.4)  Re[2]: クラステンプレートの基底クラスを抽象クラスにしてもよいか?
□投稿者/ キム (30回)-(2014/12/20(Sat) 21:14:29)
Atata!!さん、επιστημηさんお返事ありがとうございます。

やはり問題ないのですね。
私も以前は抽象クラスを基底としたクラステンプレートを書いていたのですが、コードレビューで先輩から厳しくダメ出しされて以来ダメなんだと思い込んでました。

今日も仕様書とにらめっこしましたがダメな根拠は見つけられず、お二方からご意見を伺えたことで問題ないと確信出来ました。
おかげさまで、曖昧だったものがスッキリしました。
ありがとうございます。

まとめです。

抽象クラスを基底としたクラステンプレートは、仕様的には全く問題ない。

ものすごく古いコンパイラでは問題がある可能性もあるが、自分で試した範囲ではVC++2008/2010では問題なく動作した。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -