首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这里的static_cast太不可思意了!解决思路

2012-02-25 
这里的static_cast太不可思意了!!这里的static_cast太不可思意了!!有son和father两个类,son继承自father,f

这里的static_cast太不可思意了!!
这里的static_cast太不可思意了!!

有son和father两个类,
son继承自father,
father是个虚基类

我维护的程序有如下代码:
----------------------------------
father*   f()  
{
son   *p   =   new   son();
return   static_cast   <father   *>   (p)

}
----------------------------------
这里的static_cast我就死活看不懂了:
p本来是指向son的指针,现在被static_cast强变成father的对象了。问题出现了:father本就是虚基类啊,虚基类怎么能被实例化呢?


[解决办法]
子类指针直接赋给基类指针没什么问题。实例化的是子类。
[解决办法]
static_cast没有也该行吧
father* f()
{
son *p = new son();
return p;

}
[解决办法]
基类指针指向子类实例
[解决办法]
static_cast <father *> (p)
这个static_cast可以正常工作,因为子类中有一个指向virtual base subobject的指针,所以从子类可以找到虚基类子对象(但是反过来就无法利用static_cast来实现了,只能用dynamic_cast)。但是,还是不推荐使用static_cast。

至于这个程序中为什么要用static_cast,我也不太清楚。。。
[解决办法]
也许是想减少运行期负担吧。。。
---------------------
收回这句话,说错了,免得误人子弟。
[解决办法]
是差不多的。
虚拟基类当然不能实例化,可是这里也没有虚拟机类实例化啊。只不过让一个虚拟基类的指针指向了一个子类对象而已。
而如果你想让一个虚拟基类的指针所指向的实际也就虚拟基类自己类型的对象,那是办不到的。
[解决办法]
换句话说,你当然可以:
father *p = new son();
却无法:
father *p = new father();
这才叫“虚拟基类不能实例化”。
[解决办法]
为了增加程序的可读性,基本上所有考虑如何提供编码质量的人都会告诉你,不要使用隐式类型转换,所有的类型转换都要写在代码里。
[解决办法]
换句话说,你当然可以:
father *p = new son();
却无法:
father *p = new father();
这才叫“虚拟基类不能实例化”。
=================
同意晨星!
其实你那里实例化得只是father得指针,而不是father对象。指针在任何情况下都是可以实例化得(哪怕没有类定义都可以),因为类得指针和类本身没有关系,所有得指针在32位机里都是一个4字节数。

热点排行