c++ - 我不小心调用了一个没有自己的类对象的成员函数。但这是如何工作的?

标签 c++ reinterpret-cast

这是我的代码。

class IService {
};

class X_Service {
public:
    void service1() {
        std::cout<< "Service1 Running..."<<std::endl;
    }
};


int main() {
    IService service;
    auto func = reinterpret_cast<void (IService::*)()>(&X_Service::service1);
    (service.*(func))();
    return 0;
}

我不明白这是如何工作的。我没有继承 IService 也没有创​​建 X_Service 对象,但它可以工作。
有人可以解释一下吗?

最佳答案

您的困惑可能来自误解,因为某些东西可以编译并运行而不会崩溃,因此它“有效”。这不是真的。

有很多方法可以打破语言规则,仍然编写可编译和运行的代码。通过使用 reinterpret_cast在这里并进行无效的转换,您违反了语言规则,并且您的程序具有未定义的行为。

这意味着它看起来可以工作,也可以崩溃,或者它可以做一些与你想要的完全不同的事情。

在您的情况下,它似乎有效,但它仍然是 UB 并且代码无效。

关于c++ - 我不小心调用了一个没有自己的类对象的成员函数。但这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60357367/

相关文章:

c++ - 为什么在 C++20 中删除了许多标准库类型的 operator!= ?

c++ - 排序算法代码中的未知问题

c++ - 一个 "hack"来获取 float 模板参数工作编译但在 g++ 和 clang 上出现段错误

c++ - reinterpret_cast 从原始内存中获取的指针重新分配是否会导致 UB?

c++ - %p说明符仅用于有效的指针吗?

php - 在 MacOSX 10.10 (yosemite) 上编译 php5.5.18 时出错

c++ - 我正在尝试在 Visual Studio 2013 中编写我的第一个 "Hello World"代码。为什么我收到 "IntelliSense: no operator message"和 "error C2563"?

c++ - 在 C++ 中将 wtoi 与基数一起使用

c++ - 为对象 ID 选择随机数?