考虑:
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中没有。
答案 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()
也可以这样做!这样你实际上修改了受保护的成员!