0

我有一个代码片段如下:

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;
}

类型转换是否pvoid正确pA2?还是两者都错了?(我尝试编译它,没有错误)

4

2 回答 2

0

这取决于您所说的“正确”是什么意思,但是这两个定义都是合法的并且具有明确定义的语义。pvoid将指向 的ClassB子对​​象aObject,而pA2将指向其ClassA子对象。

于 2013-04-09T07:26:23.470 回答
0

pvoid是“正确的”,因为它将ClassB子对象的地址aObject作为无类型指针提供给您。您可以用它做的唯一有用的事情就是将其转换回ClassB*. 请注意,这里的强制转换是多余的,因为任何指针都可以隐式转换为void*.

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

于 2013-04-09T07:26:37.317 回答