首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何根据基类的对象中变量的值给派生类中的变量赋值?

如何根据基类的对象中变量的值给派生类中的变量赋值?
EN

Stack Overflow用户
提问于 2017-07-17 15:34:05
回答 2查看 83关注 0票数 1

最近我在工作中发现了这段代码(这是一个人为的例子,但本质上是做同样的事情):

代码语言:javascript
运行
AI代码解释
复制
class A
{
public:
    int foo;
};

class B: public A
{
public:
    int bar;
};

int main()
{
    A a;
    a.foo = 1000;

    B b;
    A* a_ptr = &b;
    *a_ptr = a;
}

上面发生的情况是,a中的所有成员变量都被复制到b中相应的成员变量中,因为B是从A派生的,并且所有B类型的对象都保证至少具有与A类型的对象相同的所有成员变量。

在实际代码中,A有足够的变量,手动为每个变量赋值并不理想。

在与之斗争了一小段时间后,我能够理解代码在做什么,但我花了几秒钟多的时间似乎是一个危险信号。

有没有其他方法来做这段代码正在做的事情,可能更容易理解,或者更符合C++的常见实践?以这种方式赋值的变量常见吗?

编辑:有人建议我的问题可能是重复的,我问的是什么是对象切片。这不是对象切片,因为我在任何时候都没有将派生类型的对象分配给基类型的对象。因此,没有信息被“切片”或丢失在代码中的任何地方。

EN

回答 2

Stack Overflow用户

发布于 2017-07-17 15:38:15

我想说的是,使用这样的指针操作来进行赋值在C++中实际上并不常见。

另一种方法是通过强制转换明确地阐明您的意图。我不完全确定它是否更具可读性:

代码语言:javascript
运行
AI代码解释
复制
A a;
a.foo = 1000;

B b;
static_cast<A&>(b) = a;

但是,根据您的特定需求,最好使用子构造函数,该构造函数接受父构造函数并适当地构造自身。这样,您就不需要默认构造子对象,然后在第二步中分配父成员。

票数 3
EN

Stack Overflow用户

发布于 2017-07-17 16:35:43

如果a_ptr只用作将A类成员分配给B对象的临时工具,并且以后的代码只使用b,我建议为B创建一个接受A对象的构造函数。如果没有别的,它提供了比目前更好的可读性。

代码语言:javascript
运行
AI代码解释
复制
class A
{
public:
    int foo;
};

class B: public A
{
public:
    B(const A &a)
    {
       A* a_ptr = this;
       *a_ptr = a;
    }
    int bar;
};

int main()
{
    A a;
    a.foo = 1000;

    // Create B with copy of 'a' members
    B b(a);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45148202

复制
相关文章
spring类中给静态变量赋值
大家在用spring读取配置文件中的数据的时候,一定用过@Value这个注解。但有时候如果我们想要给静态变量赋值发现就不管用了,给静态变量赋值,要把@Value注解放到静态变量的set方法上。
一缕82年的清风
2021/12/06
3K0
Java 类和对象,如何定义Java中的类,如何使用Java中的对象,变量
6.类与对象方法,属性的联系和区别:类是一个抽象的概念,仅仅是模板,比如:“手机”对象是一个你能够看得到,摸得着的具体实体
用户7886150
2021/01/31
7.2K0
MySQL中变量的定义和变量的赋值使用
说明:现在市面上定义变量的教程和书籍基本都放在存储过程上说明,但是存储过程上变量只能作用于begin…end块中,而普通的变量定义和使用都说的比较少,针对此类问题只能在官方文档中才能找到讲解。
全栈程序员站长
2022/06/30
9.5K0
C++:43---派生类向基类转换、静态/动态的类变量
一、继承中类的类型转换规则 我们普通的编程规则规定,如果我们想把引用或指针绑定到一个对象上,则引用或指针的类型必须与所绑定的对象的类型一致或者对象的类型含有一种可接受的const类型转换规则。但是继承关系中的类比较例外,其规则如下: ①我们可以将基类的指针或引用绑定到派生对象上 #include <iostream>class A {};class B:public A{};int main(){ A *a; B b; a = &b; return 0;} ②即使不是指针/引用类型,我们也可以将派生类转换为
用户3479834
2021/02/03
1.8K0
C++:43---派生类向基类转换、静态/动态的类变量
Python面向对象中的类变量,实例变量怎么来理解?
前几天在Python最强王者交流群有个叫【Chloe】的粉丝问了一个类变量和实例变量的问题,这里拿出来给大家分享下,一起学习下。
前端皮皮
2022/08/17
1.7K0
Python面向对象中的类变量,实例变量怎么来理解?
java类和对象——变量赋值方法
此处的set和get的方法可以用 atl + insert 选择Getter and Setting实现
小雨的分享社区
2022/10/26
1.1K0
Ajax请求中给全局变量赋值的解决方案
ajax修改全局变量后,外面获取不到ajax里赋的值,结果为空???
MonroeCode
2018/01/10
3.2K0
python txt中的文件,逐行读取并且每行赋值给变量
最近想做自动化,想到可能会用到很多账号密码,所以想到了用参数化,但是一个用户,一个密码,中间还得一个冒号,不方便,就想到了利用Python实现(为了解决这个问题,我也花费了很长时间)
matinal
2023/10/13
3610
python txt中的文件,逐行读取并且每行赋值给变量
Ajax请求中给全局变量赋值的解决方案
昨天PP遇到一个问题,ajax修改全局变量后,外面获取不到ajax里赋的值,结果为空 问题代码如下图: 输出结果如下图: 原因: 先在控制台看看是ajax先被打印还是你的undefined先被打印
MonroeCode
2018/02/09
3.7K0
Ajax请求中给全局变量赋值的解决方案
【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )
" 匿名对象 " 的 作用域 仅限于其所在的 表达式 , 这句表达式 执行完毕后 , 匿名对象 自动销毁 ;
韩曙亮
2023/10/15
4480
【C++】匿名对象 ② ( 将 “ 匿名对象 “ 初始化给变量 | 将 “ 匿名对象 “ 赋值给变量 )
Python中类变量、成员变量、局部变量的区别
class A:v1 = 100 # 类变量def __init__(self):self.v2 = 200 # 成员变量v3 = 300 # 局部变量类变量可以由类名统一修改:A.v1 = 300# 则每一个A实例里v1都变成300成员变量只能由实例自己改变:A.v2 # 这个是错的。a = A()a.v2 # 这个是可以访问的。局部变量只在函数内部生效
狼啸风云
2020/10/16
4.5K0
ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值
变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量操作变量赋值,先有个印象, 下面慢慢来看
@零一
2021/01/29
1.3K0
vue:props中的值赋值给data
父组件: <template> <div> <navbar :ctype="ctype"></navbar> </div> </template> <script> import navbar from '@/components/navbar' export default { components: {navbar}, data () { return{ ctype:1 } } } </script> 子组件: <templa
江一铭
2022/06/16
4.2K0
awk给外部变量赋值
假设将值存在文件t中,文件t内容如下,只有一行:a b c 需要将a、b和c分别赋给外部变量x、y和z,则脚本可写成如下: eval $(awk '{ printf("x=%s\ny=%s\nz=%s",$1,$2,$3); }' ./t) echo $x echo $y echo $z 请注意printf函数中的换行符\n是必须的,起关键作用的是eval命令,它在很多场景有特别的用处。
一见
2018/08/02
4K0
变量的解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
小小杰啊
2022/12/21
3.8K0
【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
直接修改 指针变量 的值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ;
韩曙亮
2023/03/29
21.6K0
【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )
js中多个Date对象变量间赋值互相影响
<head> <title></title> <script type="text/javascript"> function pageLoad() { var dtmNow = new Date(); var dtmDt1 = dtmNow; dtmDt1.setMinutes(20); var divContent = document.getElementById("divC
欢醉
2018/01/22
6.7K0
类变量与对象变量
# 类变量与对象变量 # 代码 # coding=UTF-8,类变量与对象变量 class Robot: """表示有一个带有名字的机器人。""" # 一个类变量,用来计数机器人的数量 population = 0 # 这是一个类变量,属于Robot类 def __init__(self, name): # name变量属于一个对象(通过self分配),因此它是一个对象变量 """初始化数据""" self.name = name
benym
2022/07/14
9510
点击加载更多

相似问题

将基类对象赋值给派生类对象

30

如何使用基类对象设置派生类变量的值?

31

根据PLSQL中的条件(其他变量的值)给变量赋值

55

如何从派生类中的基类访问变量的值?

24

将基类指针赋值给目标c中的派生类

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档