近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的virtual虚函数。
就会出现gcc编译错误提示:error: ld returned 1 exit status
gcc提示原因:在link过程中,发现了无法找到的reference symbol, 该reference symbol是此父类的拷贝构造函数。
由此,我推断问题的原因是:在子类转换成父类的过程中,默认地调用了父类的拷贝构造函数。而由于项目中针对大部分类都使用了DISALLOW_COPY_AND_ASSIGN(XXX); 这个宏声明却没实现,相当于禁止了拷贝构造函数。该宏的定义如下:
#define DISALLOW_COPY_AND_ASSIGN(ClassName) ClassName(const ClassName&); void operator=(const ClassName&)
解决方法是: 转换其类型,但是不让其使用拷贝构造函数(copy constructor),代码如下:
static_cast<Parrent&>(*this);
此处使用了Parrent& 而不是 static_cast<Parrent>(*this) , 使用引用而不是类,可以避免copy新的对象, 自然就避免了调用其拷贝构造函数。
参考:
1. http://stackoverflow.com/questions/9084835/why-does-static-castthis-to-a-base-class-create-a-temporary-copy
时间: 2024-11-12 17:03:41