加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么CRTP不会导致无限嵌套?

发布时间:2020-12-16 03:40:43 所属栏目:百科 来源:网络整理
导读:我对CRTP的编译方式感到困惑.如果我们有这样的事情: templateclass Tclass Base{};class Derived : public BaseDerived{}; 为什么在编译期间没有类似的事情发生? (X [Y]表示X继承自Y) 声明派生实例后 衍生d; d正在扩展为模板和继承的无限复发 d [基衍生[基
我对CRTP的编译方式感到困惑.如果我们有这样的事情:
template<class T>
class Base
{

};
class Derived : public Base<Derived>
{

};

为什么在编译期间没有类似的事情发生?

(X [Y]表示X继承自Y)

声明派生实例后
衍生d;

d正在扩展为模板和继承的无限复发

d [基<衍生[基<衍生[基<衍生[基<衍生[…]>]>]>]>]

为什么这不会发生?关于CRTP的所有教程只解释了你可以用它做什么,而不是在幕后发生的事情(至少含糊不清).

解决方法

要理解的基本概念是模板的实例只是一个类.它根本没有任何其他类别.

如果您有典型的模板定义:

template<typename T> class Base;

然后是模板实例:

Base<int>

只是这个名字的一类.它与int无关,并且与int完全没有任何关系.它不以某种方式或以任何方式从它继承.

下一步:

class Derived;

template<typename T> class Base {};

Base<Derived> foo;

同样,Base< Derived>只是一个班级.它与Derived没有内在联系.它不是从它衍生出来的,不是从它继承而已.

那么,现在我们采取最后一步:

template<class T>
class Base
{

};

class Derived : public Base<Derived>
{

};

这声明了一个名为Derived的类,它继承自一个名为Base< Derived>的类.和Base< Derived>只是一个班级.这是一个非常简单的课程.不能比这更简单.它没有任何方法.它没有任何成员.也不是私人的,受保护的或公共的.这是一个很小的课程,但它拥有与其他课程相同的权利和特权.您可以声明指向它的指针.或者引用它.这只是一堂课.

同样,关键概念是模板的实例只是一个类.它不会以任何方式从作为模板参数的类“继承”.在这种情况下,模板实例是完全空的,但它可以执行任何其他类可以执行的任何操作.它可以拥有公共,私人和受保护的成员.它可以从一些其他类派生,它可以是另一个模板实例(因为模板实例只是一个类).或者,其他一些类可以从模板实例派生,因为模板实例只是一个类.

这里没有无限的筑巢.你只有一个继承自另一个类的类.第二个类碰巧是一个模板实例,但我碰巧提到模板实例只是一个类吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读