C ++中的struct继承与类继承

时间:2012-10-23 07:08:02

标签: c++ inheritance struct memcpy

我刚刚从这个Q/A发现结构在C ++中是可继承的,但它是一个好习惯,还是更适合使用类?在哪些情况下是优选的,哪些情况不是?

我从来没有需要这个,但现在我有一堆不同类型但经度相同的消息。我在char数组中以二进制形式获取它们,我只是将它们与memcpy一起复制到结构中以填充其字段(我不知道是否可以使用std :: copy执行此操作)。

我想能够使用公共头继承基础结构中的每个结构都很棒,这就是我搜索它的原因。所以第二个问题是:如果我用类做这个,是否可以从缓冲区到类中执行memcpy(或std:copy)?

2 个答案:

答案 0 :(得分:5)

是否可以使用按位复制与structclass标记无关,而只取决于所述structclass {{3 }}。它们是否在标准(9/6 [class])和中定义,它基本上归结为不必声明任何其他特殊成员方法而不是构造函数

然后标准在3.9 / 2 [basic.types]

中允许按位复制
  

对于普通可复制类型T的任何对象(基类子对象除外),无论对象是否包含类型T的有效值,底层字节(1.7)组成该对象可以复制到charunsigned char的数组中。如果将charunsigned char数组的内容复制回对象,则该对象应随后保持其原始值。 [示例:

#define N sizeof(T)
char buf[N];
T obj; // obj initialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
                           // `obj` might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of `obj`
                           // of scalar type holds its original value
     

- 示例]

注意:填充字节的按位副本将导致Valgrind中的报告。

使用std::copy来达到同样的效果:

char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);

答案 1 :(得分:1)

structclass之间的唯一区别是其成员的默认访问修饰符。在structpublicclassprivate(除非另有说明)。除此之外,structclass在C ++中是相同的。 有时为了可读性,结构体优先于PDO(普通数据对象),但这实际上取决于编码约定。