如何在c++中获取子类成员

How to get subclass member in c++

本文关键字:获取 子类 成员 c++      更新时间:2023-10-16

例如,我有两个class

A类:

class A
{
   private:
   int a;
}

子类B:

class B: private A
{
   private:
   char b;
   public:
   char getB();
}
代码:

int main()
{
   A* item = new B();
   char b = (B)item->getB();
}

如果我需要这样做,我应该使用cast还是重新设计程序?我不想使用多态性

的问题

1) B从a私有继承,所以只有B可以将B*转换为A*

2)表达式的优先级与(B)(item->getB());相同,因此这不会编译为itemA,而A没有成员getB()

3)最好使用static_castdynamic_cast而不是旧的C风格强制转换。

解决方案

1)如果你想在派生类和基类之外的类之间强制转换,使用公共继承。

2)然后使用括号:
char b = ((B*)item)->getB();

3)或者更精确的形式:

char b = static_cast<B*>(item)->getB();

4)但是当你像这样做向下转换时,风险由你自己承担。如果A*指针指向的不是B或从B派生的类,那么它是未定义行为。

当你考虑使用你的类型的多态时,你最好有一个虚拟析构函数,这样你就可以用适当的析构函数删除项目(这里它将使用a的析构函数而不是B的析构函数)。

只要至少有一个虚函数,就可以使用更安全的dynamic_cast:

 if(dynamic_cast<B*>(item)) {  // would be nullptr if item doesn't point to a B object
     char b = dynamic_cast<B*>(item)->getB();
     ... // further processing of the char
  }
  else cout << "Ooops!"<<endl; 

您应该使用dynamic_cast,它可以沿着继承层次结构(cppreference.com)安全地向上、向下和横向转换指针和对类的引用:

dynamic_cast<B*>(item)->getB();

,而不是旧式的C强制转换:

((B*)item)->getB();
编辑:

应该使用公共继承来使用dynamic_cast。使用private继承的目的是什么?在你的例子中,我认为这没有多大意义。使用继承而不使用虚析构函数也是危险的。