zoukankan      html  css  js  c++  java
  • C++的子类与父类强制转换产生的问题

    近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的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

  • 相关阅读:
    7、shell函数
    5、shell分支
    6、shell循环
    4、shell中的test命令
    3、shell中引号
    2、shell变量
    1、建立和运行shell
    awk命令简介
    18、异步IO
    Python模块:sys
  • 原文地址:https://www.cnblogs.com/ToDoToTry/p/4318429.html
Copyright © 2011-2022 走看看