从“哑”基类构造对象

时间:2014-09-05 11:29:35

标签: c++ constructor

我创建了一个"智能变体"标准结构 - 系统提供的struct canmsg,从can设备读取该类型的数据,我经常处理这些帧。

现在,为了更容易处理它们,我创建了一个子类:class TCanFrame : public canmsg。它没有任何额外的属性,但它有一堆方法 - 一个友好的构造函数,用于从头开始创建框架,命令和数据,读取器和设置器,读取和设置不同的属性"上面的抽象层&# 34; (例如,以数据编码的频道子地址)。

struct canmsg_t的实例构造TCanFrame类型的对象的最佳方法是什么?我可以从&sourcethis执行memcpy吗?或者我需要逐个字段地复制它吗?或者其他一些技巧来创建一个整洁的TCanFrame实例来自" dumb" canmsg或者我可以让复制构造函数接受父类吗?

2 个答案:

答案 0 :(得分:6)

如果您没有添加任何数据成员,并且不需要访问canmsg的任何受保护成员,我认为您不应该创建派生类。相反,您可以添加自由函数以在定义canmsg的命名空间中执行额外功能,然后将它们与普通canmsg对象一起使用。您可以阅读更多关于课程"非会员界面"以及为什么它在例如这些文章由Scott MeyersHerb Sutter组成。

另请注意,如果您确实创建了派生类并且canmsg没有虚拟析构函数,则可以通过调用delete上的canmsg*轻松地遇到未定义的行为它实际上指向TCanFrame对象。

答案 1 :(得分:4)

您可以使用编译器提供的默认复制构造函数:

TCanFrame(const canmsg& msg) : canmsg(msg) {}