在从POD结构继承的类中定义复制构造函数

时间:2011-09-26 13:08:09

标签: c++ copy-constructor pod

如您所知,编译器为POD结构定义默认构造函数,复制构造函数,赋值运算符和析构函数(如果未手动定义)。通常(或者我应该总是说)这是一个复制操作。所以我决定从Win结构BITMAP继承我的类,以在构造函数中提供内存分配并在析构函数中释放。我没有使用合成'因为我想允许使用它与一些WinAPI函数。这是一段代码:

class CPreviewFrame : public BITMAP
{
public:
   CPreviewFrame( );
   CPreviewFrame( std::size_t width, std::size_t height, UCHAR bytesPerPixel = 3 );
   CPreviewFrame( const CPreviewFrame& frame );

   ~CPreviewFrame( );
   .....
};

复制构造函数定义如下:

CPreviewFrame::CPreviewFrame( const CPreviewFrame& frame ):
   BITMAP( static_cast<BITMAP>(frame) ), //question is here
   m_bufferSize( frame.m_bufferSize )
{
   bmBits = new uint8_t[ m_bufferSize ];
   memcpy( bmBits, frame.bmBits, m_bufferSize );
}

所以我的问题是:从继承结构调用编译器定义的复制构造函数是正确的方法,还是应该在构造函数体中手动复制所有字段?两种变体对我来说都有些奇怪,因为尽管编译器定义了POD结构,但它们不能有构造函数。如果根据定义不存在POD数据类型,如何调用构造函数?

P.S。上面提到的代码在VS2010上编译得很好。

P.P.S。我here发布了与此主题相关的问题。

1 个答案:

答案 0 :(得分:4)

BITMAP(frame)将完成这个技巧而不需要强制转换,因为编译器将知道父类型并能够隐式转换参数。请注意,如果您想使用强制转换来明确显示您正在做的事情,请将其转换为引用类型:BITMAP( static_cast<const BITMAP&>(frame) ),

另外,请认真考虑这种继承。从现在起一两年的某个时间,有人会将您的CPreviewFrame个对象之一删除为BITMAP。最好的情况是他们泄漏内存,最糟糕的情况是你花几天或几周调试为什么应用程序无法正常工作。组合(具有可在场景后面调用WinAPI函数的适当接口)实现起来通常并不复杂,并且它将更准确和正确地模拟您的问题。

或者,您可以使用合成并仅为位图部分提供一个getter(如注释中所示)。这会暴露您的类的实现细节,但可能会使您在短期内更容易编写Win API代码。