C++父子类之间的转换

一、常识

随意打开一本C++书,基本都会写着一句话:子对象可以转化成父对象,父对象不能转化成子对象。

1.1、子对象可以转化成父对象

很好理解,其实就是C++多态的体现,父指针可以指向子对象地址,当调用父对象里生命的函数时,会默认调用子对象的此“重写函数”巴拉巴拉巴拉.....

1.2、父对象不可转化成子对象

存在即道理,这句话其实是想说明,子对象的属性或者函数大多情况下比父对象更丰富,即父亲有的东西一定会传儿子,儿子有的东西父亲不一定有【这个比喻显然不符合百善孝为先的老百姓,但C++是没有感情的东西】,如果我们将父对象转化成了子对象,那么这个对象势必会无缘无故多了一些原本不存在的属性或者函数,如果这些属性里包含一些指针或者堆上或者特有的东西,在访问的时候程序基本就崩了,就出现了程序员的老熟人“野指针”、“内存泄露”....

用一个例子:

class Parent{
    double money; 
};

class Son : public Parent{
    Girl* girl = new Girl;
};
main(){
     Parent parent;
     Son* son = &parent;
     son->girl;   
}    

如上代码:

父亲只有钱,儿子继承了父亲的钱,并且儿子还有Beautiful Girl,但是此时的实体是父亲【只有钱没有Beautiful Girl】,然后拿着儿子的身份证【接口】去访问Beautiful Girl,结果GG找不到

二、误解

2.1、现象

随意在Bing【强烈抵制Baidu】搜索C++父子类之间的转换,发现又能找到很多的方法,那这又是为什么呢?包括平时都或多或少的用到了父类转子类的方式如:在Qt界面是将一个按钮嵌入到Table里,然后又拿出来强转成按钮使用....

2.2、不多bb直接放结论:

严格意义上父类是能转化成子类的,但有限制条件,一旦不注意就会程序崩溃,不建议使用。

2.3、讨论之前需要放两个概念:

Parent* p = new Son;

①、指针对象

p,就是指针,根据多态,可以是父指针也可以是子指针。【一般父指针多得多,多态嘛】

②、对象实体

new Son,也就是new出来或者最后调用构造函数的对象【根据父子子父的顺口溜,可以知道最后调用哪个对象的构造函数,那这个对象就是最终的子类实体】

2.4、适用现象

为什么我说父类是能转化成子类的呢,是因为我们直接用父指针来指向子对象,代码是能编译过的,但是不能用父指针去获取不属于自己的属性或内存片。

所以当父指针不会跨界去访问不属于自己的东西的时候,是没问题的。

2.5、解释神奇现象

上面提到平时Qt的一些操作,这个操作虽然用的很多,但是讨论这篇文章的时候,同事提出来这个现象,我一时不知如何解释,感觉多年的C++基础知识突然崩塌了.....

后来想了想,应该是这样的步骤:
①、new出子类对象实体,用父指针指向

②、通过父指针将子类对象实体设置到界面上

③、通过父指针从界面上获取子类对象实体

④、通过static_cast将【父指针指向的】子类对象实体转成子类

其实整个过程都是子类对象实体,根本没有父对象实体,所以这里根本不是父对象转化成子对象,就是子对象的转来转去,只不过用父指针的访问罢了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱小勇本勇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值