【发布时间】:2013-05-18 02:55:50
【问题描述】:
我编写了以下愚蠢的策略结构:
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
安德烈·亚历山德雷斯库在他的一本书中写道:
除非策略类定义了虚拟析构函数,否则对指向策略类的指针应用删除具有未定义的行为。他解释了在从策略类派生时不在策略上使用虚拟析构函数或受保护(或私有)继承的原因,他建议 策略应该使用的轻量级、有效的解决方案是定义一个非虚拟保护析构函数。问题是当我尝试使用~SuperLeague(){} 执行此操作时,编译器会抱怨析构函数受到保护。我做错了什么?
【问题讨论】:
标签: c++ templates destructor