C++ 如何在c++;
例如,我有两个班 A类: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
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();