C++ C++;继承向下投射
我的基类如下:C++ C++;继承向下投射,c++,inheritance,casting,downcast,C++,Inheritance,Casting,Downcast,我的基类如下: class point //concrete class { ... //implementation } class subpoint : public point //concrete class { ... //implementation } 如何将点对象强制转换为子点对象?我尝试了以下三种方法: point a; subpoint* b = dynamic_cast<subpoint*>(&a); subpoint* b
class point //concrete class
{
... //implementation
}
class subpoint : public point //concrete class
{
... //implementation
}
如何将点对象强制转换为子点对象?我尝试了以下三种方法:
point a;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
subpoint b = (subpoint)a;
点a;
子点*b=动态施法(&a);
子点*b=(子点*)a;
子点b=(子点)a;
这些类型转换有什么问题?
a
不能转换为子点。这种实现并不存在
这些石膏有什么问题
事实上,你试图这样做。点
不是子点
,如果它有效,我会感到惊讶。总的来说,这不起作用,因为点
不是子点
;事实恰恰相反。然而,还有其他问题
为了:
要使此强制转换生效,point
需要声明一个转换运算符到subpoint*
,例如,point::operator subpoint*()
要使此强制转换生效,point需要声明一个转换运算符到子点或子点
需要一个构造函数,该构造函数采用可从point
转换的参数作为第一个示例,dynamic\u cast
仅当基类中至少有一个虚方法时才起作用。如果对象实际上不是您试图强制转换的类型,那么它将导致NULL
对于第二个示例,您需要&a
而不是a
,但一旦修复了该问题,您将得到未定义的行为,因为对象类型错误
第三个示例需要点
中的操作符subpoint()
方法在创建副本时进行转换
如何将点对象强制转换为子点对象
你不能;除非点
有一个转换运算符,或者子点
有一个转换构造函数,在这种情况下,无需强制转换即可转换对象类型
如果引用的对象实际上是子点
,则可以从点
引用(或指针)转换为子点
:
subpoint s;
point & a = s;
subpoint & b1 = static_cast<subpoint&>(a);
subpoint & b2 = dynamic_cast<subpoint&>(a);
子点s;
点&a=s;
子点&b1=静态施法(a);
子点&b2=动态投影(a);
第一个(static_cast
)更危险;没有检查转换是否有效,因此如果a
未引用子点
,则使用b1
将具有未定义的行为
第二个(dynamic_cast
)更安全,但仅当点
是多态的(即,如果它具有虚拟功能)时才起作用。如果a
引用了不兼容类型的对象,则它将抛出异常。动态强制转换的目的是“在运行时检查对象是否属于层次结构中的特定类型”。现在让我们看看你有什么:
您有一个点对象。不是一个子点
您正在询问动态投射对象是否为子点。不是
因为它不是子点,所以dynamic_cast失败了——它告诉您对象不是您试图将其强制转换到的类型
相比之下,这本可以奏效:
subpoint c;
point *a = &c;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
子点c;
点*a=&c;
子点*b=动态施法(&a);
子点*b=(子点*)a;
@MooingDuck,定义“行不通”?它应该返回一个空指针,这可能不是预期的结果,但它确实编译并执行一些有用的操作。将强制转换的对象实际上是subpoint类型,它只是在一个点数组中。static\u cast
也可能导致未对齐的对象。我在32位ARM上遇到了这个问题。我强制转换到派生对象,然后调用仅存在于派生对象中的函数。瑞桑得出了一系列的发现。我必须切换到dynamic\u cast
来挤压它们。@jww,如果我没有virtual
功能,我是否还需要担心未对齐的对象,因为我将根本无法使用dynamic\u cast
?这是正确的答案!如果基地是自己建造的,那么它就不能被降级。也就是说,dynamic\u cast
将失败!
subpoint b = (subpoint)a;
subpoint s;
point & a = s;
subpoint & b1 = static_cast<subpoint&>(a);
subpoint & b2 = dynamic_cast<subpoint&>(a);
subpoint c;
point *a = &c;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;