gpt4 book ai didi

c++ - C++ 中策略类的 protected 析构函数

转载 作者:行者123 更新时间:2023-11-28 00:44:57 26 4
gpt4 key购买 nike

我编写了以下愚蠢的策略结构:

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 在他的一本书中写道:除非策略类定义了虚拟析构函数,否则将 delete 应用于指向策略类的指针具有未定义的行为。他解释了在从策略类派生时不对策略或 protected (或私有(private))继承使用虚拟析构函数的原因,并且他建议策略应该使用的轻量级、有效的解决方案是定义一个非虚拟的 protected 析构函数。问题是,当我尝试使用 ~SuperLeague(){} 执行此操作时,编译器会提示析构函数受到保护。我做错了什么?

最佳答案

您不应该在 League::fun() 中创建临时策略对象.由于您的 League 实例模板派生自 Policy 的适当实例模板,它继承了 printLeague()功能:

template
<typename TT,template <typename C> class Policy>
class League: public Policy<TT>
{
public:
void fun()
{
Policy<TT>::printLeague();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
}
};

声明析构函数时解决方案无法编译的原因 protected是那个protected在访问同一派生类(在您的情况下为League)的对象(或取消引用对象的引用或指针)时,使派生类可以访问基类成员。

在您的示例中情况并非如此,您创建了一个 Policy<TT> 类型的临时对象并调用 printLeague() 在该对象上(不是 League 类型)。

根据 C++11 标准的第 11.4/1 段:

An additional access check beyond those described earlier in Clause 11 is applied when a non-static data member or non-static member function is a protected member of its naming class (11.2). As described earlier, access to a protected member is granted because the reference occurs in a friend or member of some class C. If the access is to form a pointer to member (5.3.1), the nested-name-specifier shall denote C or a class derived from C. All other accesses involve a (possibly implicit) object expression (5.2.5). In this case, the class of the object expression shall be C or a class derived from C.

关于c++ - C++ 中策略类的 protected 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16702224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com