0

テンプレート化されたベース クラスメソッド (つまり、非テンプレート メソッドを持つテンプレート クラス) を子でオーバーライドするにはどうすればよいでしょうか?

#include <Windows.h>
#include <iostream>

struct S{};

template <typename T>
class Base
{
public:
    Base()
    {
        Init(); // Needs to call child
    }

    virtual void Init() = 0; // Does not work - tried everything
    // - Pure virtual
    // - Method/function template
    // - Base class '_Base' which Base extends that has
    //      pure virtual 'Init()'
    // - Empty method body
};

class Child : public virtual Base<S>
{
public:
    virtual void Init()
    {
        printf("test"); // Never gets called
    }
};

int main()
{
    Child foo; // Should print "test"

    system("pause");
    return 0;
}

子クラスの型をテンプレート引数として基本クラスに渡してから を使用する手法は知っていますが、static_cast信じられないほど簡単なはずのことに対して、私にはあまりにも不潔です。

何時間も検索して、この特定のシナリオに対するコードや解決策を見つけることができないため、テンプレートの背後には把握していない基本的なアイデアがあると確信しています。

4

1 に答える 1

3

コンストラクターからメソッドを呼び出すvirtualことは、期待どおりの動作を得られないため、悪い考えです。のコンストラクターがBase実行されるとき、オブジェクトはまだ完全には構築されておらず、まだChild.

コンストラクタの外で呼び出すとうまくいきます。

于 2012-09-24T09:34:01.757 に答える