c++中对象的转换

Conversion of objects in c++

本文关键字:转换 对象 c++      更新时间:2023-10-16

问题:如何将一个类类型更改为另一个类类型?

我的回答:

       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