如何在子项中覆盖基本的模板化类方法(即带有非模板方法的模板类)?
#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
的技术,但对于我来说,这对于我应该非常容易的东西是非常不洁净的。
我确信模板背后有一些基本的想法,我只是没有理解,因为我一直在寻找几个小时,但找不到任何代码或解决方案。
答案 0 :(得分:3)
从构造函数调用virtual
方法是一个坏主意,因为它没有得到您期望的行为。当Base
的构造函数执行时,该对象尚未完全构造,并且还不是Child
。
在构造函数外部调用它会起作用。