如何从基类指针访问顶层类中的变量

时间:2013-11-17 11:47:03

标签: c++ pointers inheritance

我有一个基类和一个派生类

class A
{
public:
int a;
}

class B : public A
{
public:
int b;
}

如果我有一个A类型的指针到B对象,我该如何检索指向B对象的指针?

A * ptrA = new B;

如何使用ptrA访问b

3 个答案:

答案 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
}