Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++继承枚举 在C++中,我有一个基类A,例如,看起来是这样的:_C++_Inheritance - Fatal编程技术网

C++继承枚举 在C++中,我有一个基类A,例如,看起来是这样的:

C++继承枚举 在C++中,我有一个基类A,例如,看起来是这样的:,c++,inheritance,C++,Inheritance,对于每个枚举类型,我有另一个从基A派生的类。 例如,我有一个这样的类: 我的问题是:对于一个对象,我知道它的类型是B,所以它对应于类B,是否有可能访问变量x,例如,如果是,如何访问?我知道从基类访问派生类有点棘手,但我认为这与此不同。如果您有a*a或a&a,并且确定它实际上指向/引用了类型B的对象,则可以使用强制转换: A *a = ...; B *b = static_cast<B*>(a); 或 我建议使用动态强制转换,最好是安全的。不,它只是利用运行时类型信息来确保a实际上是

对于每个枚举类型,我有另一个从基A派生的类。 例如,我有一个这样的类:

我的问题是:对于一个对象,我知道它的类型是B,所以它对应于类B,是否有可能访问变量x,例如,如果是,如何访问?我知道从基类访问派生类有点棘手,但我认为这与此不同。

如果您有a*a或a&a,并且确定它实际上指向/引用了类型B的对象,则可以使用强制转换:

A *a = ...;
B *b = static_cast<B*>(a);


我建议使用动态强制转换,最好是安全的。不,它只是利用运行时类型信息来确保a实际上是B的实例。另一个方向的向上转换将在编译时进行检查。@Marius如果不知道强制转换能否成功,或者您处于复杂的层次结构中,并且无法应用静态强制转换,请使用动态强制转换。如果您知道,也就是说,您可以断言强制转换成功,那么可以使用static_cast,或者实际获取断言。另外,您还需要一个虚拟成员才能使dynamic_cast工作。好的,我知道了。谢谢!我同意,使用调试构建断言和静态转换将是性能关键代码的最佳解决方案。然而,我倾向于在其他情况下使用dynamic_cast,因为,如果您有一个错误,在错误的类中进行了转换,您就会知道。此外,OpenSSL团队还“知道”必须发送回客户端的有效负载的大小,对吗?OK完全无关,但是如果我们在C++中有这样的安全特性,为什么不使用它们。
class B : public A {
    int x;
    ....
    ....
};
A *a = ...;
B *b = static_cast<B*>(a);
A &a = ...;
B &b = static_cast<B&>(a);