2010-11-01 36 views
0

如果我有以下类:指向基类

class A 
{ 
    ... 
} 

class B 
{ 
    ... 
} 

class C : public A, public B 
{ 
    ... 
} 

和地方我检测B类的指针,我居然有指向一类C,而是一个功能需要一个指向A类,我能做些什么来获得指向类A的指针?

+0

发布您的代码。 C已经是A了,所以不需要投射。 – 2010-11-01 02:05:21

+0

奇怪。你可以复制粘贴真正的代码? – tibur 2010-11-01 02:05:29

+0

对不起,我混了起来,现在我贴出真正的问题 – wrongusername 2010-11-01 02:10:46

回答

1

如果你肯定知道你有一个B*指向一个C对象,你可以用一对static_cast S:

B* bp = new C(); 
C* cp = static_cast<C*>(bp); 
A* ap = static_cast<A*>(cp); 

整个继承层次投的唯一方法就是使用dynamic_cast ,这需要该类型是多态的(即,你的类必须具有至少一个虚拟成员函数; since your base class destructors should be virtual,这通常不是问题):

B* bp = new C(); 
A* ap = dynamic_cast<A*>(bp); 

如果它失败(即,如果bp实际上没有指向C),则它会返回NULL。它具有性能成本稍微的缺点(static_cast在运行时是有效的)。

+0

问题谢谢!它编译:) – wrongusername 2010-11-01 02:20:26

1

如果C如您所示从C继承,那么C *指针应隐式转换为A *指针。是否有可能没有包含类C的声明,以便编译器不知道这种继承关系?或者说,你的问题实际上有一种不同的继承关系?一些代码将有助于诊断这个问题。

编辑
基于更新版本的问题:

// Converts b to type A*, but only if it is actually 
// of type C; otherwise, returns NULL 
A* convertBtoAviaC(B* b) { 
    C* c = dynamic_cast<C*>(b); 
    return c; // note may be NULL, if b is not a C 
} 
+0

哦!我只检查了一倍。是的,存在不同的继承关系......我将更新 – wrongusername 2010-11-01 02:07:44

1

代码

class A 
{ 
}; 
class B 
{ 
}; 
class C : public A, public B 
{ 
}; 
int main() { 
    C c; 
    A *a = &c; 
} 

是有效的,因为c已经是A,所以分配是有效的。

相关问题