gpt4 book ai didi

c++ - 我可以将 final 关键字应用于 C++11 中的 POD(标准布局)结构吗?我是不是该?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:07 34 4
gpt4 key购买 nike

在一个充满对象(具有适当行为)和相对较少的非面向对象结构(仅由数据字段和无方法组成)的 C++ 项目中,我想防止意外误用这些结构,其中可能会尝试创建一个继承自它的类。

根据我的理解,因为这些“POD”(普通旧数据)结构没有虚拟析构函数,所以不可能通过指针正确删除派生类对象(如果允许创建它) POD 类型。

这似乎是 C++11“final”关键字的一个很好的用例,它将一个类或结构标记为不可继承。

但是,我想知道“final”关键字是否会导致结构变为非 POD?

我怀疑标准文档可能已经解决了这个问题,但我不够聪明,无法在很长的文档中进行筛选以找出答案。欢迎任何有用的指示。

注意:我对仅仅知道它通过了某些编译器供应商的编译不感兴趣。通过编译不保证:

  • 编译后的代码是否在所有情况下都能正确执行(尤其是当该技术应用于更大、更复杂的项目时),
  • C++ 标准机构是否打算以这种方式使用它。
#include <iostream>
using namespace std;

struct Pod final
{
int a;
int b;
int c;
};

#if 0
class FailsBecauseCannotDeriveFromFinalAnything : public Pod
{
};
#endif

class ContainsSomethingFinalAsMember
{
public:
ContainsSomethingFinalAsMember() : pod() {}
private:
Pod pod;
};

int main()
{
std::cout << std::is_pod < Pod > :: value << std::endl;
return 0;
}

最佳答案

According to my understanding, because these "POD" (plain old data) structs do not have a virtual destructor, it is not possible to properly delete a derived class object (if one is allowed to create it) via a pointer of the POD type.

给定原始指针是不可能的,但给定智能指针对象是可能的,例如 std::shared_ptr 或具有适当删除器。

自从智能指针被标准化后,就没有理由继续遵循手动使用 delete 运算符的不良做法。当然,不应围绕与 delete 运算符的兼容性来设计类。每个类接口(interface)在设计时都应考虑到其特定用途。

不,让每个类都成为 final 或多态的并不是一个好习惯。

However, I wonder if the "final" keyword causes the struct to become non-POD?

不,它仍然是 POD。 POD 的要求是标准布局(反过来不需要基类、成员之间没有访问说明符、没有虚拟任何东西)和简单的特殊成员函数(复制/移动构造函数、赋值运算符、析构函数)。

但是,POD-ness 的目的是允许您使用 memcpy 而不是正确构造对象,好的 C++ 代码会避免这样做。

关于c++ - 我可以将 final 关键字应用于 C++11 中的 POD(标准布局)结构吗?我是不是该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31398388/

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