通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
Calling derived class's methods from pointer to base class via reinterpret_casting the method pointer. Is this UB?
通过指向派生类型的对象的指针分配给其基类的指针,我发现您可以将派生类的方法reinterpet_cast到基类的指针,即使基类没有任何此类函数(虚拟、隐藏或其他(。它可以从那里取消引用和调用,它"只是工作"。但我想确保它不是 UB。这是 UB 吗?它是便携式的吗?
可编译示例:
#include <cstdio>
struct A { /* no foo method */ };
struct B : public A { void foo(void){printf("foo");} };
typedef void (B::*B_FOO_PTR)( void );
typedef void (A::*A_FOO_PTR)( void );
int main ( void ) {
B b;
A* a = &b;
// address of a and b are identical
B_FOO_PTR b_ptr = &B::foo;
// (a->*b_ptr)(); // COMPILE ERROR: calling B method from A. Not Allowed, but...
A_FOO_PTR a_ptr = reinterpret_cast<A_FOO_PTR>(b_ptr);
(a->*a_ptr)(); // works, outputs "foo"
return 0;
}
这是未定义的行为。唯一可以调用结果的指向成员函数的转换是:
- 往返转换,以及
- 指向基数成员的指针到派生成员的指针。
您尝试与第二点相反,该点已从此列表中排除。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将成员函数指针作为参数传递给模板方法
- 通过函数指针定义类范围之外的方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 如何访问由共享指针保存的类方法?
- 初始化指向类实例的智能指针并访问其方法
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 有没有将变量名称转换为双指针的简短方法?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 类指针方法崩溃程序
- 证明两指针方法有效(对和)
- Qt 删除指针方法
- 我如何将一些类的指针方法转换为指针函数