草庐IT

c++ - reinterpret_cast<> 和可移植性

我读过reinterpret_cast如果使用不当可能会很危险。所以我相信我使用得当;)。我发现如果我有模板类并且需要类型转换,那么使用它会很好。但最近我读到reinterpret_cast也是不可携带的。我为这一点感到难过。什么原因?拿下面的代码,voidDisp(int*val){for(inti=0;i(arr);for(unsignedchar*i=ptr;i现在输出:117421487232767419678905683925845841967200000000000000Machinetype:Linux2.6.32-358.11.1.el6.x86_64#1x86_64x

c++ - 转换为基类有效性

假设我有一个名为Base的类和一个从它派生的名为SuperBase的类。假设add接受了一个Base*,那么这些是否有效:SuperBase*super=newSuperBase;bases.add(super);或者SuperBase*super=newSuperBase;bases.add((Base*)super); 最佳答案 只要SuperBase通过从派生到基的隐式转换公开派生自Base,第一个就可以工作:structbase{virtual~base(){}};structderived:base{};base*b=ne

c++ - 子类转换和指针地址更改

我在C++中使用多重继承已有很长时间了,但直到今天才意识到这可能意味着在将它们作为子类之一引用时指针地址可能不同。例如,如果我有:classClassA{public:intx;inty;ClassA(){cout在构造函数上打印时,A类和C类具有不同的地址。然而,当我尝试将它们相互转换回对方时,它会自动运行:ClassA*the_a=(ClassA*)b;cout我想这种信息可以由编译器从代码中派生出来,但是假设这适用于所有编译器是否安全?附加问题:是否可以强制子类位置的顺序?例如,如果我需要首先定位classA(本质上,共享相同的指针位置)作为它的子类的ClassC,我是否只需要将

c++ - 重新诠释

在C++WithoutFear:ABeginner'sGuideThatMakesYouFeelSmart一书中,在第(8)章中,提到了以下关于reinterpret_cast....从一种指针类型(int)转换为另一种(char*)。因为转换改变了指向数据的解释方式,所以它被称为reinterpret_cast,而不是static_cast。*你能在这里描述一下这一段吗?特别是操作命名方式的原因?谢谢。 最佳答案 基本上,reinterpret_cast将特定位置的位模式重新解释为不同的类型。参见此处的示例:http://publ

C++ 转换会创建一个新对象吗?

如上标题所示,我的问题只是C++转换是否会创建目标类的新对象。当然,在问这个问题之前,我已经使用了Google、MSDN、IBM和stackoverflow的搜索工具,但我找不到合适的答案来回答我的问题。让我们考虑以下使用虚拟继承解决的菱形继承(钻石问题)的实现:#include#includestructA{inta;A():a(2){}};structB:virtualpublicA{intb;B():b(7){}};structC:virtualpublicA{intc;C():c(1){}};structEND:virtualpublicB,virtualpublicC{int

c++ - 自动调用原始指针的自定义转换器 A* <-> B*

是否可以在不同类型的原始指针converter1之间定义自定义转换器(converter2和A*)和B*,然后在某个类中创建所有函数(fa()和fb())使用适当的转换器(converter1或converter2)?简而言之,我想让程序转换A*至B*反之亦然使用我的自定义函数。为了我的方便,我希望它会自动执行此操作。classManager{voidfb(B*b){/**somethingcomplex*/}voidfa(A*a){/**differentthingcomplex*/}voidtestCase(){A*a=...;fa(a);fb(a);//automaticconv

c++ - 如何从 char* 转换为 T*?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:C++Whenshouldweprefertouseatwochainedstatic_castoverreinterpret_cast哪个更好?static_cast(static_cast(buffer));或reinterpret_cast(buffer);其中buffer是char*(包含T类型值的内存块)。

c++ - 通过转换为 Visual C++ 中的函数指针来执行 shellcode

在gcc中这工作正常。代码是这样的:unsignedcharb[50]="\xda\xd1...\x0";//someshellcodewithterminating\x0((void(*)())b)();//castbtofunctionpointerfromvoidtovoid,thenrunit但是当它被放入VisualC++时,它会吐出这个错误信息:1>..\test.cpp(132):errorC2440:'typecast':cannotconvertfrom'unsignedchar[50]'to'void(__cdecl*)(void)'1>Thereisnoconte

c++ - 指针向下转换和向上转换的用法区别?

我想知道当我们使用向下转换和向上转换时,指针转换到底发生了什么。我有两个问题。其中前2个是评论。Q3终于结束了。#includeusingnamespacestd;classA{public:virtualvoidf(){coutf();pb->f();paUpcast->f();pbDowncast->f();return1;}问题3:我想总结一个规则来推断如果我们将虚函数和指针一起使用会发生什么,但我就是想不通。本来我以为虚函数会把我们带到指针真正指向的地方。因此,当我们输入A*paUpcast=newB();paUpcast->f();如果A.f()是虚函数,第二行会显示“B”,

c++ - 将指向数据成员的指针转换为 void *

我知道我可以获得指向类或结构的数据成员的指针,但以下代码的最后一行无法编译:structabc{inta;intb;charc;};intmain(){charabc::*ptt1=&abc::c;void*another_ptr=(void*)ptt1;}为什么我不能将ptt1转换为another_ptr?我们正在谈论指针,所以一个指针应该与另一个指针具有相似的维度(尽管在概念上不同)? 最佳答案 指向非静态类成员类型的指针与对象指针类型不同;他们的行为非常不同。事实上,您甚至不能取消引用指向带有*的成员的指针。要通过指向成员的指