C++ 如何在c++;

C++ 如何在c++;,c++,inheritance,polymorphism,C++,Inheritance,Polymorphism,例如,我有两个班 A类: class A { private: int a; } B类: class B: private A { private: char b; public: char getB(); } 代码: 如果我需要这样做,我应该使用cast还是重新设计程序?我不想使用多态性。问题 1) B私下从A继承。因此只有B可以将AB*强制转换为A* 2) 表达式的优先级与(B)(item->getB())相同因此它不会编译为项是A并且A没有成员g

例如,我有两个班

A类:

class A
{
   private:
   int a;

}
B类:

class B: private A
{
   private:
   char b;

   public:
   char getB();
}
代码:


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

问题

1) B私下从A继承。因此只有B可以将A
B*
强制转换为A*

2) 表达式的优先级与
(B)(item->getB())相同
因此它不会编译为
A
并且A没有成员
getB()

3) 最好使用
static\u cast
dynamic\u cast
而不是旧的C风格的cast

解决方案

1) 如果要在派生类和类本身之外的基类之间强制转换,请使用公共继承

2) 然后使用括号:

char b = ((B*)item)->getB();
3) 或者更喜欢更精确的形式:

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

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

编辑:


您应该使用公共继承来使用
动态\u cast
。使用继承的目的是什么?在你的例子中,这没有多大意义。在没有虚拟析构函数的情况下使用继承也是危险的。

您正在寻找虚拟函数吗?另外,我认为您打算编写
((B*)项)->getB()。我不想使用虚拟函数。那么为什么要对
B*
使用基类指针呢?因为我需要这个。在另一种情况下,我使用polimorphism。在一种情况下,我只需要获取
char b
。但它不会从私有基转换。s/upcasting/downcasting/其他方式没有风险吗?我不想要纯虚拟函数,因为我必须为所有子类A定义这个函数。我不想要虚拟函数,因为我必须在类A中定义它。@user3191398是的,但至少有一个虚拟函数。请参见第4点中的编辑
char b = static_cast<B*>(item)->getB();
 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<B*>(item)->getB();
((B*)item)->getB();