为什么最后一条命令无效?编译器无法解析。
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/