gpt4 book ai didi

c++ - 通过指针访问私有(private)虚拟成员函数

转载 作者:行者123 更新时间:2023-11-30 02:31:55 24 4
gpt4 key购买 nike

class foo{
public:
int n;
private:
virtual void sayHi(){
cout<<"Hi there!";
}

};

如何获取 sayHi() 的地址?

main(){
foo f;
typedef void(*fptr)();
fptr func = reinterpret_cast<fptr>((&f)[0]);
(*func)();
}

上面的代码不起作用。

我知道“f”对象的前 8 个字节是指向虚拟表的指针,其中包含指向函数的指针,我使用的是 64 位机器。我基本上是想通过它的指针调用 sayHi() 而不是直接从 f 调用它,因为 sayHi() 无论如何都是私有(private)的!我该怎么做?我分配的对吗??

最佳答案

您不能简单地拥有一个指向非静态成员函数的指针并在没有对象的情况下调用它。解释您的问题的最直接的方法是使用 pointer-to-member如:

auto fptr = &foo::sayHi;
foo f;
(f.*fptr)();

现在,你说你想调用它而不必通过 f。目前尚不清楚这到底是什么意思。使用 lambda 可能足以创建一个可按需工作的可调用对象

auto func = [] { return foo{}.sayHi(); };
func(); // call

或使用特定对象并通过引用(显示)或值捕获它

foo f;
auto func = [&f] { return f.sayHi(); };
func();

关于c++ - 通过指针访问私有(private)虚拟成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37016510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com