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
C++的子类与父类强制转换产生的问题的更多相关文章
- Java父类强制转换子类原则
最近,微信群友在讨论子类父类的转换问题,其实不难,给大家用实例来说明一下就很明了了. 我们知道Java中子类转换成父类是没有任何问题的,那父类可以转换成子类吗? 来看下面这段程序: public cl ...
- (转载) Java子类与父类之间的对象转换
在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...
- java 强制转换
在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- Java子类与父类之间的类型转换
1.向上转换 父类的引用变量指向子类变量时,子类对象向父类对象向上转换.从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制. 2.向下转换 在父类变 ...
- c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...
- 子类覆写的变量被private隐藏,强制转换方式通过子类访问父类的被覆写变量:
import static java.lang.System.*; public class SuperParent{ public static void main(String[] args){ ...
- C#中 父类与子类相互强制转换之实验
MSDN是很好,不过,有时需要自己动手实践一下,才能更好的理解和记住一些东西. 我看过很多技术文章,结果到用时,仍然是下不了手.似是而非的. 像上次写的“四舍六入五成双/四舍六入五留双/四舍六入五单双 ...
- Java中父类强制转换为子类的可能
之前徒弟问了一个问题, 在Java中, 父类对象到底能不能转换成对应的子类对象? 到底能不能, 今天就来说说这个问题, 先看下面一段代码: package cn.com.hanbinit.test; ...
- 阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 父子类变量名相同会咋样? 为啥强制子类.父类变量名不同? ...
随机推荐
- (APIO2014)序列分割
题解: 我也不知道为啥上午上课讲了我昨天看的3题 这题关键在于发现操作顺序无关的 可以发现最终答案是任意两段乘积的和 那这个东西显然是可以dp的 然后可以斜率优化一波 nklongn 另外上课讲的是当 ...
- expect自动化工具
http://blog.csdn.net/wangtaoking1/article/details/78268574 http://blog.csdn.net/genggood/article/det ...
- Codeforces 744C Hongcow Buys a Deck of Cards 状压dp (看题解)
Hongcow Buys a Deck of Cards 啊啊啊, 为什么我连这种垃圾dp都写不出来.. 不是应该10分钟就该秒掉的题吗.. 从dp想到暴力然后gg, 没有想到把省下的红色开成一维. ...
- 007 关于Spark下的第二种模式——standalone搭建
一:介绍 1.介绍standalone Standalone模式是Spark自身管理资源的一个模式,类似Yarn Yarn的结构: ResourceManager: 负责集群资源的管理 NodeMan ...
- 编译linux内核以及添加系统调用的全过程
参考链接: https://www.zybuluo.com/hakureisino/note/514321# 北京邮电大学操作系统实验: https://wenku.baidu.com/view/6d ...
- lnmp thinkphp在linux上支持pathinfo
在lnmp环境中布置thinkphp 默认不支持pathinfo 的 在nginx.conf文件中的server中更改如下 #include enable-php.conf; #布置下面的支持pat ...
- 前端解读控制反转(IOC)
前言 随着前端承担的职责越来越重,前端应用向着复杂化.规模化的方向发展.大型项目模块化是一种趋势,不可避免模块之间要相互依赖,此外还有很多第三方包.这样的话如何去管理这些繁杂的文件,是一个不可避免的话 ...
- JS中获取文件点之后的后缀字符
var FileName = $("#file").val(); var index1=FileName.lastIndexOf("."); var index ...
- 如何通过<include/>标签重用Mybatis的代码段
1.首先定义一个sql标签,一定要定义唯一id<sql id="Base_Column_List" >name,age</sql>2.然后通过id引用< ...
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...