访问基类对象中的受保护成员

Accessing protected members in base class objects

本文关键字:受保护 成员 基类 对象 访问      更新时间:2023-10-16

考虑:

class A {
protected:
    int _i;
};
class B : public A {
    B(const B & object) {
        _i = object._i;
    };
    B(const A & object) {
        _i = object._i;
    };
};

第一个复制构造函数是正确的,因为权限基于类,而不是对象。因此,我可以从自己的类对象访问受保护的成员。为什么第二个构造函数(或任何类似的方法)引发编译时错误?

简而言之:为什么在这种情况下,C++ 中的权限检查不考虑类继承规则?

在Apple LLVM-4.2中

也遇到过这种情况,但在Apple LLVM-4.1中没有遇到。

简而言之:为什么在这种情况下,C++ 中的权限检查不考虑类继承规则?

您正在询问禁止第二个构造函数的规则背后的理由。

若要理解基本原理,请考虑以下代码:

A a;
a._i = 100; //error, _i is protected 

这是正确的,也是意料之中的。目前为止,一切都好。

但是,如果允许第二个构造函数(在您的代码中),那么任何人都可以编写类modify为:

struct modify : public A {
    void i(A & object, int newValue) {
        object._i = newValue; //MODIFY THE PROTECTED MEMBER of the argument!
    };
};

然后你可以这样做:

A a;
modify().i(a, 100); //okay, indirectly modify a._i !!!
std::cout << a._i << std::endl; //prints 100

如果第二个构造函数可以访问参数的protected成员,那么modify::i()也可以这样做!这样你就可以实际修改受保护的成员!