我写了以下愚蠢的策略结构:
template
<typename T>
struct SuperLeague
{
public:
void printLeague(){std::cout << "SuperLegue" << std::endl;};
protected:
//~SuperLeague(){}
};
和宿主类
template
<typename TT,template <typename C> class Policy>
class League: public Policy<TT>
{
public:
void fun()
{
Policy<TT>().printLeague();
}
};
我的主要是
int main()
{
League<int,SuperLeague> k;
League<int,SuperLeague> kk;
k.fun();
kk.printLeague();
League<int,SuperLeague> *kkk=new League<int,SuperLeague>();
kkk->fun();
//delete kkk;
};
直到这里,一切正常。输出是:
SuperLegue
SuperLegue
SuperLegue
在他的一本书中,Andrei Alexandrescu 写道:
除非策略类定义了虚拟析构函数,否则将删除应用于指向策略类的指针具有未定义的行为。他解释了在从策略类派生时不在策略上使用虚拟析构函数或受保护(或私有)继承的原因,他建议策略应该使用的轻量级、有效的解决方案是定义一个非虚拟的受保护析构函数。问题是,当我尝试使用~SuperLeague(){}
编译器执行此操作时,会抱怨析构函数受到保护。我做错了什么?