关于基类和子类赋值的问题

banjo 2003-10-16 11:16:18
class base
{
...
};
class derived:public base
{
...
};
请解释一下以下用法是否正确,赋值是bitcopy还是member copy
base b;
derived d;
d=b;//a
b=d;//b
能否给出正确的方法?尽量不要改动类的拷贝/构造函数
...全文
113 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极猩猩 2003-10-16
  • 打赏
  • 举报
回复
第一个会有编译错误
第二个不会有编译错误,但是这个复制的结果是切割,就是说b是一个彻底的base类的对象,不带有任何derived类的成员(数据或函数),而且调用b的函数时,不会有动态绑定
darcymei 2003-10-16
  • 打赏
  • 举报
回复
只要你有把握
b=d编译器会自动转换
d=b你可以写成d=*((derived*)&b);
zgrpmc 2003-10-16
  • 打赏
  • 举报
回复
如果没有对应的拷贝构造函数或者重载"=",直接赋值恐怕会导致编译错误吧?
darcymei 2003-10-16
  • 打赏
  • 举报
回复
我的意图是将某个BASE的成员变量赋值到某个DERIVED对应的变量,有没有其他比较简单的实现方法?
最安全的,重载=
最简单的,d=b你可以写成d=*((derived*)&b);,member copy
herrycsdn 2003-10-16
  • 打赏
  • 举报
回复
我觉得不管你是否有c-c (拷贝构造函数),编译器都会执行member copy,因为这里bitcopy已经没有什么意义,如果你没有自己创建拷贝构造函数,编译器会自动创建。注:指的是c++编译器

第一个应该是错的,一般情况不允许向上映射,
第二个是对的,但会引起对象切片

个人意见
Wolf0403 2003-10-16
  • 打赏
  • 举报
回复
这样的转换,感觉不应该用 dynamic_cast 吧。dynamic_cast 是 RTTI 操作符,主要用于判断继承关系并进行指针的 down-cast 的。
C++ 的精华就在于:对于一起可能引发歧异的东西,我们都可能通过重载解决。呵呵。纠缠这个问题是没有意义的。
banjo 2003-10-16
  • 打赏
  • 举报
回复
c++中有没有对应的概念或者方法呢/?
banjo 2003-10-16
  • 打赏
  • 举报
回复
我的意图是将某个BASE的成员变量赋值到某个DERIVED对应的变量,有没有其他比较简单的实现方法?
zoohoo 2003-10-16
  • 打赏
  • 举报
回复
第二个是对的,第一个需要做地址的传递
nirvana_li 2003-10-16
  • 打赏
  • 举报
回复
同意 Polarislee(北极星) 的,第2个动作的确会有切割,而且隐式转换会不安全,C++标准新引入的cast会帮助你进行安全的型别转换,用一用dynamic_cast就行。赋值应该是member copy.

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧