代码之家  ›  专栏  ›  技术社区  ›  Brian Bi

受保护的成员访问检查是否可以使用静态\u cast进行颠覆?

  •  1
  • Brian Bi  · 技术社区  · 6 年前

    考虑

    class A {
      protected:
        int m;
    };
    class B : public A {
        void foo(A& a) {
            a.m = 42;  // ill-formed
        }
        void bar(A& a) {
            auto pm = &B::m;
            auto pm2 = static_cast<int A::*>(pm);
            a.*pm2 = 42;  // is this ok?
        }
    };
    

    正在尝试访问 A::m static_cast

    [ Coliru link 表明 bar

    0 回复  |  直到 6 年前
        1
  •  4
  •   P.W    6 年前

    是的,您可以通过使用 static_cast

    这种特殊情况下的未定义行为。

    通过使用 静态浇铸 你告诉编译器两件事:

    1. B 指针指向 A 指针。

    对于1,编译器应用非常有限的检查来判断这是否正确,对于 静态浇铸 它允许从派生到基部,反之亦然,就是这样。所以编译器很高兴。变量或指针是受保护的还是公共的不是变量或指针类型的一部分。都不是 pm 也不是 pm2 携带 protected 信息。

    pm2 只是一个指向 . 您可以将其重置为指向其他 int 在里面 这是公开的。

    背景是C++中的访问控制一般是每个类,加上还有一些额外的规则。 受保护的

    推荐文章