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;