覆盖基本模板类方法

时间:2012-09-24 09:32:31

标签: c++ templates methods override virtual

如何在子项中覆盖基本的模板化类方法(即带有非模板方法的模板类)?

#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的技术,但对于我来说,这对于我应该非常容易的东西是非常不洁净的。

我确信模板背后有一些基本的想法,我只是没有理解,因为我一直在寻找几个小时,但找不到任何代码或解决方案。

1 个答案:

答案 0 :(得分:3)

从构造函数调用virtual方法是一个坏主意,因为它没有得到您期望的行为。当Base的构造函数执行时,该对象尚未完全构造,并且还不是Child

在构造函数外部调用它会起作用。