gpt4 book ai didi

C++ : CRTP destructor?

转载 作者:太空宇宙 更新时间:2023-11-04 14:56:33 26 4
gpt4 key购买 nike

在一个项目中,我遇到了以下问题:

我有一个非常简单的继承方案(我需要继承而不是组合):

类基础

->类DerivedA

->类DerivedB

->类DerivedC

A、B 和 C 派生自 Base,仅此而已。所以现在我有两个选择:

具有虚拟性的公共(public)继承

没有虚拟的私有(private)继承

出于某些优化原因(我需要大量内联),我不想要虚拟性……而且我不想要私有(private)继承。我认为剩下的唯一选择是 CRTP。但是基类有大约 300 个函数,在其中实现 CRTP 将是一个真正的痛苦。

所以我想知道以下解决方案是否有效:我只在基类的析构函数中使用 CRTP:

template<class TCRTP> class Base
{
~Base() {delete static_cast<TCRTP*>(this);}
}

其中 TCRTP 将是 DerivedA、B 或 C,我进行公共(public)继承。是完全没问题还是有问题?

非常感谢。

最佳答案

你的析构函数绝对是错误的。一个类的析构函数不会也不应该delete对象的内存。

您对没有虚函数的公共(public)继承有何异议?有(至少)几种方法可以防止某人通过基指针意外删除派生对象。一种是制作基本析构函数 protected .

另一种方法是将派生类的动态分配实例直接填充到 shared_ptr 中。 .这甚至可以是 shared_ptr<Base> :

std::shared_ptr<Base> foo(new DerivedA(...));

因为 shared_ptr有一个捕获其参数类型的模板构造函数,Base*指针将转换为 DerivedA*在与 shared_ptr 关联的删除函数中,因此正确删除。没有人会愚蠢到试图从 shared_ptr 中提取指针。并将其删除为 Base* .

当然,如果您没有虚函数,那么这个技巧只有在派生类之间的唯一区别在于它们在构造函数中设置的内容时才真正有用。否则你最终需要向下转换 Base*。来自 shared_ptr 的指针, 在这种情况下你应该使用 shared_ptr<DerivedA>开始。

关于C++ : CRTP destructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10754991/

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