我有一个代码段如下:
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
吗?或者他们两个都错了?
(我试图编译它,没有错误)
答案 0 :(得分:0)
这取决于“正确”的含义,但这两种定义都是合法的,并且具有明确定义的语义。 pvoid
将指向ClassB
的{{1}}子对象,而aObject
将指向其pA2
子对象。
答案 1 :(得分:0)
pvoid
在某种意义上是“正确的”,它将ClassB
aObject
子对象的地址作为无类型指针。您可以使用它做的唯一有用的事情是将其强制转换回ClassB*
。请注意,此处的强制转换是多余的,因为任何指针都可以隐式转换为void*
。
pA2
已正确初始化为指向ClassA
的{{1}}子对象。由于这是一个“交叉转换”(即两个类型都不是从另一个派生的,但它们都是某些派生类的基类),你需要像你所做的那样通过派生类型进行转换,或者使用{{ 1}}如果在编译时不知道派生类型。