使用此技巧从外部访问受保护的成员,但这是否有效?

Ton*_*ina 4 c++

如果我有以下课程:

class Foo
{
protected:
    int i;
public:
    Foo() : i(42) {}
};
Run Code Online (Sandbox Code Playgroud)

当然,我无法从外部访问受保护的成员,但我可以做这个小技巧:首先我创建一个继承Foo的新类:

class Foo2 : public Foo
{
public:
    int GetI() { return i; }
};
Run Code Online (Sandbox Code Playgroud)

现在,每当我有一个Foo实例或指向此类实例的指针时,我都可以通过强制转换访问受保护的成员(因为我不使用任何其他成员):

Foo *f = new Foo();
Foo f2;
std::cout << ((Foo2*)f)->GetI() << std::endl;
std::cout << (reinterpret_cast<Foo2&>(f2)).GetI() << std::endl;
Run Code Online (Sandbox Code Playgroud)

我明白为什么会这样,但是会不会有任何不良后果?编译器不介意,没有任何运行时检查.

Alo*_*ave 5

reinterpret_cast<Foo2&>(f2)).GetI()
Run Code Online (Sandbox Code Playgroud)

从技术上讲,这是未定义的行为.所以它可能会起作用,但它没有必要.

  • @ToniPetrina:对我来说,更重要的问题是你为什么需要这个技巧?访问规范不是为了欺骗编译器,它是一种实现可维护和精心设计的代码的手段,人类必须维护而不是编译器. (3认同)