C#程序员写C++程序(非托管)的困惑我是先学的c#再学c++,由于C++的强大,本人开始逐渐的告别c#了。不过在写C++
C#程序员写C++程序(非托管)的困惑
我是先学的c#再学c++,由于C++的强大,本人开始逐渐的告别c#了。不过在写C++程序的时候有点困惑。
如下的继承:
class CA --基类-->Class CB1
--基类-->Class CB2
如上:CA继承自CB1,CB2
如果 CA* ca=new CA();
CB1* cb1=(CB1*)ca;//正常
CB2* cb2=(CB2*)cb1;//运行时报错(指针不知道指到哪里去了)只要一调用“cb2->方法” 就乱套了。
这是为啥;C#可以这样用接口强制类型转换,只要CA继承类这个接口,不管接口之间是什么关系,或者接口之间没有继承关系都可以这样牵制转换,而且正常。C++就不能?
[解决办法]
cb2 类 和 cb1 类一点关系都没有,是不能用 cb2的指针指cb1的对象的
强制过去只会出错
[解决办法]
为什么要用CB2指向CB1呢
这两个类可以说没有任何关系的,没有相同的成员变量,没有相同的成员函数
是不是把关系的方向搞反了
基类:animal
子类:dog, sheep
这样的话还能说得过去,他们有共同的父类
[解决办法]
C#的强制类型转换 并不等价于 C++的强制类型转换
C#的接口继承 也并不等价于 C++的类继承
[解决办法]
补充提醒:
用C#的习惯来写C++,会死的很惨
用C++的习惯来写C#,要想死很难
[解决办法]
楼主做指针转换的时候可以考虑C++提供的operator
static_cast<>(普通类型转换)
dynamic_cast<>(安全向下的类型转换,转换成功返回指针,不成功,返回null)
这个问题牵扯到C++对象的内存布局的问题,你把子类型转换成父类型之后两个父类型之间没有任何关系,这样当然转换的时候就会出错~
多重继承向上转型的时候this指针的值会发生变化的,一般来说和父类的顺序还有一定的关系,看看C++对象模型吧,一下就能明白了~
ps:这种转换最少少用,因为这个转换的时候不同的编译器实现机制不一样,不保证能跨平台。
[解决办法]
倒,目前C#最新版比C++强大多了。
[解决办法]
[解决办法]学c++/cli吧 1
[解决办法]大规模并行计算,你应该去学erlang
[解决办法]#include <stdio.h>
#include <string.h>
class ba
{
public:
void OutputA(){cout << "ba ... "<< endl;}
};
class bb
{
public:
void OutputB(){cout << "bb ... "<< endl;}
};
class d : public ba, public bb
{
public:
void OutputD(){cout << "d ... "<< endl;}
};
int main()
{
d*pd = new d;
ba *pba = (ba *)pd;
bb *pbb = (bb *)pba;
pbb->OutputB();
printf("%f",10/3);
float a = 1.22;
int b = 1;
return 0;
}
这样会出错吗? 不可能吧。
[解决办法]ca同时继承于cb1和cb2吗
如是看起来好像没什么问题 建议用dynamic_cast来完成指针转换
[解决办法]dynamic_cast的用法及特性可百度之
[解决办法]指向有问题,即使转换了,他的地址也不一定是你想要的
[解决办法]#include <stdio.h>
#include <string.h>
class ba
{
public:
void OutputA(){cout < < "ba ... " < < endl;}
};
class bb
{
public:
void OutputB(){cout < < "bb ... " < < endl;}
};
class d : public ba, public bb
{
public:
void OutputD(){cout < < "d ... " < < endl;}
};
int main()
{
d *pd = new d;
ba *pba = (ba *)pd;
bb *pbb = (bb *)pba;
pbb->OutputB();
printf("%f",10/3);
float a = 1.22;
int b = 1;
return 0;
}
这样会出错吗? 不可能吧。
[解决办法]
[解决办法]在类型转换中改变指针地址,那是c++干的事情。 c干的强制类型转换,不会改的。 你用的是c的方式,怎么可能会改。
[解决办法]d*pd = new d;
ba *pba = (ba *)pd;
bb *pbb = (bb *)pba;
void* v= (d*)pd;
pbb = (bb *)v;
这样转换类型,无论几次都一样的。 仅仅是二进制地址的拷贝。
[解决办法]ba *pba = (ba *)pd; 这种类型转换,就是c干的。
ba * pba =reinterpret_cast<ba *>(pd); 这种才是c++干的。
[解决办法]dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。
转换失败,返回null.
这应该是你想要的。