如果我有以下类:指向基类
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
和地方我检测B
类的指针,我居然有指向一类C
,而是一个功能需要一个指向A
类,我能做些什么来获得指向类A
的指针?
如果我有以下类:指向基类
class A
{
...
}
class B
{
...
}
class C : public A, public B
{
...
}
和地方我检测B
类的指针,我居然有指向一类C
,而是一个功能需要一个指向A
类,我能做些什么来获得指向类A
的指针?
如果你肯定知道你有一个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
在运行时是有效的)。
问题谢谢!它编译:) – wrongusername 2010-11-01 02:20:26
如果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
}
哦!我只检查了一倍。是的,存在不同的继承关系......我将更新 – wrongusername 2010-11-01 02:07:44
代码
class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
C c;
A *a = &c;
}
是有效的,因为c已经是A,所以分配是有效的。
发布您的代码。 C已经是A了,所以不需要投射。 – 2010-11-01 02:05:21
奇怪。你可以复制粘贴真正的代码? – tibur 2010-11-01 02:05:29
对不起,我混了起来,现在我贴出真正的问题 – wrongusername 2010-11-01 02:10:46