如何在c++中获取子类成员
How to get subclass member in c++
例如,我有两个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());
相同,因此这不会编译为item
是A
,而A没有成员getB()
。
3)最好使用static_cast
或dynamic_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
继承的目的是什么?在你的例子中,我认为这没有多大意义。使用继承而不使用虚析构函数也是危险的。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- C++ 如何从虚拟类的模板化子类中获取数据?
- 在子类上调用模板化静态方法时获取类的类型名
- 获取参数的子类
- 类来获取 Base 的任何子类
- 使用子类从std :: Pironity_queue获取容器时会编译错误
- 基于className的字符串为QObject的子类获取QMetaObject
- 在Qt中获取超类中的子类的名称
- 使用shared_ptr时获取子类的type_info
- 如何从基类的唯一指针获取子类的成员
- 子类获取超类私有变量c++
- 获取定义为父类的子类以输出子函数
- 在窗口循环中,在窗口控件上获取鼠标移动比子类化更容易
- 获取 QWidget 的 Windows 消息而不对其进行子类化并重新实现 QWidget::winEvent
- 如何在c++中获取子类成员