MyException - 我的异常网
当前位置:我的异常网» C++ » 有没有很自然的方法向下转换的方法?该怎么处理

有没有很自然的方法向下转换的方法?该怎么处理

www.MyException.Cn  网友分享于:2013-02-23  浏览:7次
有没有很自然的方法向下转换的方法?
class   A
{
}
class   B   :   public   A
{
}

main()
{
A*   a   =   new   A()
B*   b   =   a;
}

有没什么办法使B*   b   =   a编译通过?
我的想法是用operator实现,可是我写不出,请教高手

------解决方案--------------------
这样转换不行的吧,除非
A* a = new B();

operator = 也是B =, 不是B*
------解决方案--------------------
B* b = (B*)a;
------解决方案--------------------
class A
{
}
class B : public A
{
}

main()
{
A* a = new B()
B* b = dynamic_cast <B*> (a);
}
------解决方案--------------------
向下转型,最好还是不要那么自然。因为本来就是一个有风险的动作,做起来太自然了,反倒会有害。
------解决方案--------------------
class A{};
class B{};
class C : public A, public B{};

void main()
{
A* pA = new A;
C* pC = pA; // C包含AB,若A想向C转换,必须告诉C其B部分是什么样的,光有A不行
}

所以如楼上所说,很危险

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

void main()
{
A* pA = new B;
B* pB = dynamic_cast <B*> (pA);
}

需要转换的话用dynamic_cast <派生类指针> (基类指针)
------解决方案--------------------
dynamic_cast就可以了,如果编译器旧的话也可以强制转换
------解决方案--------------------
我觉得Polarislee(北极星)(无房无车,飘在北京)说的有道理,无论你使用任何方法 "骗 "过了编译器,就你现在的代码而言,本身是否设计缺陷的,或者说你这样的转化是没有实际意义的.
我这里简单设想一个downcasting发生合理的情况:
1.加入你设计了一个比较深的类的继承结构,例如:
class Base;
class Derived1: public Base;
class Derived2: public Base:
class MyDerived1: Derived1;
class MyDerived2: Derived2;
2.创建多个派生类对象,但是都是通过基类指针保存他们的地址,例如:
Base* pBase1 = new Derived1;
Base* pBase2 = new MyDerived2;
3.这时候你需要将这些基类指针转化它他们正确的派生类对象指针,这时候你就需要 "安全 "的downcasting,你可以通过dynamic_cast <> 来完成:
Derived1* pD = dynamic_cast <Derived1*> (pBase1); //ok
Derived1* pD2 = dynamic_cast <MyDerived2*> (pBase1); //error
------解决方案--------------------
向下转, 还要自然. 为什么呀.

人是动物的一个子类. 如果向下转很自然,
岂不是任何动物都可以安全的当成人处理了.
写童话呢, 还是写程序呢.
------解决方案--------------------
main()
{
A* a = new A()
B* b = (B*)a;
}

强转,但运行肯定是错的,a的空间只有a的所有数据那么大。

把它强转成B类型的,会已a的起始地址处开始,找出B类型这么大的空间 附给b,出错了。

除非是
main()
{
A* a = new B()
B* b = (B*)a;
}

这样没问题,但 还是不提倡。
------解决方案--------------------
没有,是有意不让它有很自然的方法向下转换。因为“丑陋的代码,应当以丑陋的形式表现”。向下转换本身就是不合理的和危险的。所以,得用dynamic_cast <> 这种麻烦的方法操作。目的是为了让你尽量少写这种代码。另外,不要用(B*)这种c风格的转换,因为这种代码是难以查找到的。而xxxx_cast <> 操作符很容易通过文本查找找到。
最后,用了dynamic_cast <> 之后,请检查结果,因为如果转换不成功,返回0。如果不想出现非法访问,这种检查是必须的:
B* b=dynamic_cast <B*> (a);
if(b==0)
... // 错误处理
总之,如果你在编程时发现必须使用向下转换,那么请检查你的设计,那里肯定有些不合理地方。如果实在无法避免,就使用dynamic_cast <> ,并检查结果。这样做,才是严谨的和可靠的。
------解决方案--------------------
至于operator=,因为它的参数不能是指针,所以这样的操作符重载是无法实现的。

文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
编程语言是女人
编程语言是女人
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我是如何打败拖延症的
我是如何打败拖延症的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
鲜为人知的编程真相
鲜为人知的编程真相
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
中美印日四国程序员比较
中美印日四国程序员比较
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
漫画:程序员的工作
漫画:程序员的工作
总结2014中国互联网十大段子
总结2014中国互联网十大段子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
老程序员的下场
老程序员的下场
一个程序员的时间管理
一个程序员的时间管理
代码女神横空出世
代码女神横空出世
程序员应该关注的一些事儿
程序员应该关注的一些事儿
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
那些争议最大的编程观点
那些争议最大的编程观点
旅行,写作,编程
旅行,写作,编程
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员的鄙视链
程序员的鄙视链
如何成为一名黑客
如何成为一名黑客
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
我的丈夫是个程序员
我的丈夫是个程序员
程序员都该阅读的书
程序员都该阅读的书
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
每天工作4小时的程序员
每天工作4小时的程序员
 程序员的样子
程序员的样子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有