作者WangDaMing (王大明)
看板C_and_CPP
标题[问题] 为何static_cast会产生新物件??
时间Mon Feb 15 00:28:06 2021
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
最近看书,不懂为何子类别static_cast成父类别
会产生一个新的暂时父类别??
我不是很懂为何要特别产生一个新的B??用原始d1的父类别B去操作感觉也没问题阿?
谢谢
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://pastebin.com/embed_js/is7CQ0p5?theme=dark
#include <iostream>
using namespace std;
class B{
private:
int b;
public:
B(){b = 0x1234;}
virtual void set(int t){b = t;}
virtual void get(){cout << "0x" << hex << b << "\n";}
};
class D : public B{
private:
int d;
public:
D(){d = 0x5678;}
};
int main(){
D d1;
D *ptr = &d1;
static_cast<B>(*ptr).set(100);//产生一个新的B去set
ptr->get();
}
补充说明(Supplement):
※ 编辑: WangDaMing (110.26.33.194 台湾), 02/15/2021 00:30:39
1F:推 LPH66: 任何转型本来就是「转成」目标型态的物件, 所以产生新物件 02/15 00:53
2F:→ LPH66: 本来就是合理的结果; 你想要的操作可通过转型其指标或参考 02/15 00:53
3F:→ LPH66: 达成, 并且使用指标或参考也才能使用到多型的语意 02/15 00:54
4F:→ loveme00835: 你原来是写 Java 吗? 这个会牵扯到 reference semant 02/15 10:21
5F:→ loveme00835: ics 还有 value semantics 的差别, 转型在 C# 的定义 02/15 10:21
6F:→ loveme00835: 也不太一样 02/15 10:21
7F:推 kaneson: 正解是写法改成 static_cast<B*> 02/17 08:38
8F:推 kaneson: 跟这样写同理 D d = (D) b; 02/17 08:41
9F:→ kaneson: 会发生copy 02/17 08:41