C++ 为什么我能够使用CRTP将基类的this指针转换为子类的指针?

C++ 为什么我能够使用CRTP将基类的this指针转换为子类的指针?,c++,crtp,dynamic-cast,static-cast,C++,Crtp,Dynamic Cast,Static Cast,考虑以下类,它们使用了奇怪的循环模板模式(CRTP): 模板 阶级基础 { 公众: 虚拟~Base(){} 此()的无效类型 { 通过调用dynamic_cast(this)->hello();,我仍然获得相同的结果。我希望dynamic_cast返回nullptr,但它没有 我对这些结果感到非常惊讶。感谢您帮助我澄清我的疑问!当T与this指向的对象的真实类型不匹配时,用于调用hello()的cast具有未定义的行为没有通过这个访问任何东西,所以这个实际上指向什么并不重要。你可以很容易地重新解

考虑以下类,它们使用了奇怪的循环模板模式(CRTP):

模板
阶级基础
{
公众:
虚拟~Base(){}
此()的无效类型
{
通过调用
dynamic_cast(this)->hello();
,我仍然获得相同的结果。我希望
dynamic_cast
返回
nullptr
,但它没有


我对这些结果感到非常惊讶。感谢您帮助我澄清我的疑问!

T
this
指向的对象的真实类型不匹配时,用于调用
hello()
的cast具有未定义的行为
没有通过
这个
访问任何东西,所以这个实际上指向什么并不重要。你可以很容易地重新解释一下cast(12345)->hello(),它仍然会“工作”。但是你决定使用
这个
不会有任何区别,因为
hello()
只是忽略结果(对于
动态\u cast
,请参阅)


更改您的类,以引入
hello()
尝试通过
访问的数据成员,您将看到非常不同的结果(即,代码可能会崩溃或报告垃圾等)。

用于调用
hello()的强制转换当
T
this
指向的对象的真实类型不匹配时,
具有未定义的行为。但是
hello()
没有通过
this
访问任何内容,因此这
实际指向的对象并不重要。您可以轻松地执行
重新解释(12345)->hello()
仍然可以“工作”。但是您决定强制执行
时,这不会有任何区别,因为
hello()
只会忽略结果(对于
动态\u强制执行
,请参阅)


更改类以引入
hello()
尝试通过
this
访问的数据成员,您将看到非常不同的结果(即代码可能会崩溃或报告垃圾等).

谢谢你深思熟虑的回答,雷米!我不知道在nullptr上调用一个方法实际上可以工作。这是我的经典,选择一个失败的测试作为理智检查哈哈哈。谢谢你深思熟虑的回答,雷米!我不知道在nullptr上调用一个方法实际上可以工作。这是我的经典,选择一个测试作为一个理智的检查失败了哈哈哈。
Type of this:  P4BaseI7DerivedE
Type of *this: 7Derived
Hello from Derived!
Type of this:  P4BaseI7DerivedE
Type of *this: 4BaseI7DerivedE
Hello from Derived!