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

时间:2013-01-29 12:41:15

标签: c++ inheritance llvm-clang

考虑:

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中没有。

1 个答案:

答案 0 :(得分:3)

  

简而言之:为什么在这种情况下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()也可以这样做!这样你实际上修改了受保护的成员!