c++ - 类型转换 - C++

标签 c++ inheritance type-conversion

为什么最后一条命令无效?编译器无法解析。

class IRNode
class IINputBS
class ColumnReaderNode: public IRNode, public IInputBS

ColumReaderNode *col = new ColumnReaderNode();
IRNode *node = col;
IInputBS *bs2 = (IInputBS *)(col); //valid
IInputBS *bs1 = (IInputBS *)(node); //invalid

最佳答案

在 C++ 代码中使用 C 风格的转换是个坏主意,原因如下。如果您使用的是 C++ 转换,第一个可以使用 static_cast 完成,而第二个则需要您使用 reinterpret_cast 来构建。这应该会触发一个警告信号——需要对指针使用 reinterpret_cast 通常意味着编译器没有足够的信息来进行正确的转换。

这正是正在发生的事情。仅给定一个 IRNode*,无法从中计算出一个 IInputBS* - 它们不相关。例如,可以以任意复杂的方式从这两个派生出任意多个类。

您有两个选择。如果您确定您的对象实际上是从两者派生的类型(例如 ColumReaderNode 在您的情况下)并且您只想获得它的另一个父级,则可以使用 static_cast 向下转型,剩下的留给隐式转换(或者再次使用 static_cast,如果你愿意的话):

IInputBS *bs1 = static_cast<ColumnReaderNode*>(node); // upcast will happen implicitly

IInputBS *bs1 = static_cast<IInputBS*>(static_cast<ColumnReaderNode*>(node)); // explicit, but superfluous upcast

如果您不确定该对象实际上是 ColumnReaderNode 类型,您可以使用 dynamic_cast。这有运行时成本,但它实际上会通过检查您指向的对象的实际运行时类型来做正确的事情:

IInputBS *bs1 = dynamic_cast<IInputBS*>(node);

如果对象是适当的类型,这将执行正确的转换,否则将 bs1 设置为空值。

dynamic_cast 要求所涉及的对象是多态的(即至少有一个 virtual 成员函数),但我认为这在您的情况下已经实现。

关于c++ - 类型转换 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23610846/

相关文章:

c++ - 在 C++/CLI Visual Studio C++ 中使用指定的数组位置将文本框中的值保存在 char 中

c++ - 为什么连续调用 new[] 不分配连续内存?

c# - 如何将 List<Child> 传递给带有参数 List<Parent> 的方法?

delphi - 向非接口(interface)派生对象添加接口(interface)

list - 如何在 Scala 中将列表元组展平为列表列表

python - Cython 的新手......似乎无法正确包装枚举

c++ - 为什么需要 this 指针来访问继承的属性?

Java:一个类是它自己的子类吗?

c++ - 将 char 类型转换为 int 以用作 vector C++ 的索引

javascript - 将从 Number.toString 生成的字符串转换为数字