c++中对象的转换
Conversion of objects in c++
问题:如何将一个类类型更改为另一个类类型?
我的回答:
X is a object of class X
Y is a object of class Y
x=y;
这个答案正确吗?类类型是否可以通过将其对象等同于其他类对象而更改为另一个类类型?
当你遇到一个可以用一个非常简单的程序测试的问题时,你编写这个程序并尝试它。
a = b
的作用可以很容易地被测试。
class A
{
}
class B
{
}
int main()
{
A = B;
}
这个失败了,因为此时A和B只是抽象的概念。
int main()
{
A a;
B b;
a=b;
}
这试图将B类型的数据复制到a类型的空间中。编译器不允许这样做,因为在软件中正方形的钉子并不比在现实生活中更适合圆孔。你可以告诉编译器,通过在a中创建一个以b为参数的=
运算符,你将使b适合于a,但a仍然是a。
为什么会这样?当你做了一个A,你就有了一定量的内存来存储这个A,并签订了一个由A类定义的契约,规定了特定的东西要放到特定的地方。违反契约,坏事就会发生。
你可以做一些我们在更原始的时代经常不得不做的恶心的事情,比如将A类型转换为B:
A a;
B b;
*((B*)&a) = b;
但A仍然是A,你只是把一个b形的物体强行放进了它的空间。当这种情况发生时,程序会发生什么?我将引用经典:
我们死去。
—Lord Kril The Last Starfighter
但它可能需要一段时间,看起来像它工作。A仍然是A,只是现在它是一个破碎的A,等待着机会使你的程序崩溃。
如果你想让A现在是B,创建一个新的B,并使用=
操作符将它从A复制到新的B中。
您还可以利用具有共同祖先的类以类似的方式行事,例如
class base
{
public:
int getBaseval()
{
return baseval;
}
private:
int baseval;
}
class A: public Base
{
}
class B: public Base
{
}
您可以指望A和B都有baseval
,并在调用getBaseval
时返回baseval
,但这是您所能期望的最好结果。你不能把A变成B或者Base。您可以将A视为Base,但它仍然是A。A可以使用它们都具有的函数(请仔细阅读virtual关键字)执行与Base或B完全不同的操作,但它仍然具有该函数。它仍然是a
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 将父类对象强制转换为子类的问题
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 已转换对象的地址
- 如何在OpenGL中使用关键事件来转换对象
- 使用父类实例化的向下转换对象
- 静态强制转换允许转换对象指针,但不允许转换整数
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 找到对象类型后,是否可以使用 static_cast 强制转换对象
- 旨在复制/转换对象的功能系列的模板
- luabind 如何隐式强制转换对象
- 转换对象
- 使用隐式可转换对象调用move重载函数时的编译错误
- 关于在 cpp 中转换对象的两个问题
- 在运行时根据实例变量强制转换对象(c++)
- 使用用户定义的类型强制转换对象
- 在c++中转换对象
- 从"int"到非标量类型赋值运算符的转换 - 对象到 int
- 在屏幕上转换对象可编程管道
- 在 C 样式类型转换期间,关于强制转换对象的地址空间的实际情况