C++ C++;静态_cast与动态_cast #包括 阶级基础{ }; 派生类:公共基{ }; int main(){ Base*bptr=新派生的(); 导出*dptr=静态_转换(bptr); std::cout

C++ C++;静态_cast与动态_cast #包括 阶级基础{ }; 派生类:公共基{ }; int main(){ Base*bptr=新派生的(); 导出*dptr=静态_转换(bptr); std::cout,c++,C++,静态\u cast(表达式) 如果new\u type是指向某个D类和 表达式是指向其非虚拟基B的指针或引用, 静态_cast执行向下广播。如果B为 不明确、不可访问或虚拟基(或虚拟基的基) 这种静态_cast不进行运行时检查,以确保 对象的运行时类型实际上是D,并且只有在 这一前提条件通过其他方式得到保证,例如 实现静态多态性。可以使用 动态播放 (说明项目2)static\u cast(表达式) 如果new\u type是指向某个D类和 表达式是指向其非虚拟基B的指针或引用, 静态_cast

静态\u cast(表达式)

如果
new\u type
是指向某个D类和
表达式
是指向其非虚拟基B的指针或引用, 静态_cast执行向下广播。如果B为 不明确、不可访问或虚拟基(或虚拟基的基) 这种静态_cast不进行运行时检查,以确保 对象的运行时类型实际上是D,并且只有在 这一前提条件通过其他方式得到保证,例如 实现静态多态性。可以使用 动态播放


(说明项目2)

static\u cast(表达式)

如果
new\u type
是指向某个D类和
表达式
是指向其非虚拟基B的指针或引用, 静态_cast执行向下广播。如果B为 不明确、不可访问或虚拟基(或虚拟基的基) 这种静态_cast不进行运行时检查,以确保 对象的运行时类型实际上是D,并且只有在 这一前提条件通过其他方式得到保证,例如 实现静态多态性。可以使用 动态播放

(说明项目2)

在上面的代码中,我应该使用
dynamic\u cast
,但我使用的
static\u cast
不正确。
static\u cast
不应该在向下转换时使用,因为编译器无法确定我们是否正确执行了cast

具有讽刺意味的是,
dynamic_cast
实际上是这里格式不正确的cast,因为您的类型不是多态的

也就是说,
static\u cast
当然可以用于downcast。编译器不能进行类型检查是正确的,但在许多情况下,您有一个
Base*
,并且知道它指向一个
派生的*
,因此您可以手动执行cast。一个非常常见的情况是CRTP:

#include <iostream>

class Base {
};

class Derived : public Base {
};

int main() {
    Base* bptr = new Derived();

    Derived* dptr = static_cast<Derived*>(bptr);

    std::cout << dptr << std::endl;
}
模板
阶级基础{
派生的&self(){return*static_cast(this);}
// ...
};
类Foo:Base{…};
Base
始终是一个
T
,因此下行广播是安全的

<>代码> STATICE-CAST 优于<代码> DyrimaCase > <>代码> StistalCase是免费的,但是<代码> DyjiCaseCase<代码>是昂贵的。C++咒语是不为你不需要的东西付费的。 在上面的代码中,我应该使用
dynamic\u cast
,但我使用的
static\u cast
不正确。
static\u cast
不应该在向下转换时使用,因为编译器无法确定我们是否正确执行了cast

具有讽刺意味的是,
dynamic_cast
实际上是这里格式不正确的cast,因为您的类型不是多态的

也就是说,
static\u cast
当然可以用于downcast。编译器不能进行类型检查是正确的,但在许多情况下,您有一个
Base*
,并且知道它指向一个
派生的*
,因此您可以手动执行cast。一个非常常见的情况是CRTP:

#include <iostream>

class Base {
};

class Derived : public Base {
};

int main() {
    Base* bptr = new Derived();

    Derived* dptr = static_cast<Derived*>(bptr);

    std::cout << dptr << std::endl;
}
模板
阶级基础{
派生的&self(){return*static_cast(this);}
// ...
};
类Foo:Base{…};
Base
始终是一个
T
,因此下行广播是安全的


<>代码>静态码> >动态>强制> >代码>是代码> STATICE-CAST 是免费的,但是<代码>动态> CAST <代码>是昂贵的。C++咒语是不为你不需要的东西付费的。

< P> >完全正确地使用<代码> SistaCysPase<代码>。你是对的,编译器在一般情况下不知道是否演员阵容是正确的,但是静态演员阵容就在这个场景中

这里不能使用
dynamic\u cast
,因为该cast用于多态类(具有虚拟成员函数的类)。这些类携带运行时信息;这些信息允许代码在指向的对象的实际类型中选择该函数的正确实现。强制转换函数可以使用对象中的此类型信息来确定是否可以进行类型转换,然后确实正确地执行转换(对于多重继承和虚拟继承,这可能很棘手)


没有虚拟函数的类(如示例类)不携带此运行时信息,并且
动态_cast
不能用于转换为更派生的类型。(它仍然可以用于转换为相同的类型或基类,也就是说,它可以用于实际上不需要转换的转换。)

您使用的是
static\u cast
非常正确。您是对的,在一般情况下,编译器可能不知道该cast是否正确,但是
static\u cast
正好适用于此场景

这里不能使用
dynamic\u cast
,因为该cast用于多态类(具有虚拟成员函数的类)。这些类携带运行时信息;这些信息允许代码在指向的对象的实际类型中选择该函数的正确实现。强制转换函数可以使用对象中的此类型信息来确定是否可以进行类型转换,然后确实正确地执行转换(对于多重继承和虚拟继承,这可能很棘手)

没有虚拟函数的类(如示例类)不携带此运行时信息,并且
动态_cast
不能用于转换为更派生的类型。(它仍然可以用于转换为相同类型或基类,即,它可以用于