我有一个基类和一个派生类
class A
{
public:
int a;
}
class B : public A
{
public:
int b;
}
如果我有一个A类型的指针到B对象,我该如何检索指向B对象的指针?
即
A * ptrA = new B;
如何使用ptrA
访问b
?
答案 0 :(得分:5)
如果您确定A *实际指向B,则可以无条件地执行此操作而不会产生性能开销:
A * ptrA = new B;
B * ptrB = static_cast<B *>(ptrA);
ptrB->b = 42;
如果ptrA实际上没有指向B的实例,这将导致未定义的行为。如果您不确定,可以这样检查:
if (B * ptrB = dynamic_cast<B *>(ptrA)) {
ptrB->b = 42;
} else {
// it's not a B, do something else
}
这里的区别在于dynamic_cast实际上会在运行时检查以确保强制转换,如果没有则返回NULL。
请注意,仅当您的基类至少有一个虚拟方法时,dynamic_cast才有效。感谢DietmarKühl在评论中指出了这一点。
答案 1 :(得分:4)
由于A*
是通过B*
的直接隐式转换获得的,因此您可以使用
static_cast<B*>(ptrA)->b
如果你需要经常在你的代码中这样做而不是在蓝色的月亮中这样做,那么你的设计就会出现问题。
答案 2 :(得分:1)
您可以在c-style演员表中投射(B*)ptrA->memberOfB()
。或者更安全:dynamic_cast<A*>(ptrA)
。
ptrB = dynamic_cast<A*>(ptrA);
if(ptrB!=null)
{
//casted properly
ptrB->memberOfB();
}
else
{
//can not be casted
}