输入铸造问题

时间:2013-04-09 07:15:16

标签: c++ type-conversion

我有一个代码段如下:

class ClassA
{
public:
    virtual ~ ClassA() {};
    virtual void FunctionA() {cout << "ClassA" << endl;}
};
class ClassB
{
public:
    virtual void FunctionB() {};
};
class ClassC : public ClassA, public ClassB
{
public:
    void FunctionA(){cout << "why" << endl;}
    void FunctionB(){cout << "class C funb" << endl;}
};

ClassC aObject;
ClassA* pA = &aObject;
ClassB* pB = &aObject;
ClassC* pC = &aObject;

int main()
{
    void* pvoid = static_cast<void *> (pB);
    ClassA* pA2 = static_cast<ClassA*>(static_cast<ClassC*>(pB));

    return 0;
}

类型转换为pvoidpA2吗?或者他们两个都错了? (我试图编译它,没有错误)

2 个答案:

答案 0 :(得分:0)

这取决于“正确”的含义,但这两种定义都是合法的,并且具有明确定义的语义。 pvoid将指向ClassB的{​​{1}}子对象,而aObject将指向其pA2子对象。

答案 1 :(得分:0)

pvoid在某种意义上是“正确的”,它将ClassB aObject子对象的地址作为无类型指针。您可以使用它做的唯一有用的事情是将其强制转换回ClassB*。请注意,此处的强制转换是多余的,因为任何指针都可以隐式转换为void*

pA2已正确初始化为指向ClassA的{​​{1}}子对象。由于这是一个“交叉转换”(即两个类型都不是从另一个派生的,但它们都是某些派生类的基类),你需要像你所做的那样通过派生类型进行转换,或者使用{{ 1}}如果在编译时不知道派生类型。

相关问题