通过继承和函数指针绕过保护

Posted

技术标签:

【中文标题】通过继承和函数指针绕过保护【英文标题】:Bypassing protected with inheritance and function pointer 【发布时间】:2021-11-01 16:37:31 【问题描述】:

我已经多次看到以下模式用于访问受保护的成员函数。

class A
public:
    virtual ~A();
protected:
        void foo()
;

class B : public A;


class Hacky : public B
public:
    using B::foo;
;

int main()
    B b;
    A& a = b;
    auto ptr = &Hacky::foo;
    (a.*ptr)();

我认为这是this page 之后的未定义行为,内置指向成员的访问运算符,第 5 点(这里 E1 动态类型是 B,它不包含 Hacky::foo),但我'我不能 100% 确定。有人能给出一个明确的答案吗?

【问题讨论】:

这个答案***.com/questions/49550663/…是针对字段的,但是推理应该是一样的, 【参考方案1】:

type of ptrvoid (A::*)(),而不是 void (Hacky::*)(),所以没关系。

【讨论】:

以上是关于通过继承和函数指针绕过保护的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用函数指针调用函数会绕过钩子?

通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)

虚函数指针和虚函数表

函数指针和继承

获取指向基类受保护成员函数的函数指针

成员函数指针和继承