2

考虑:

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

4

1 回答 1

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()也可以这样做!这样你实际上修改了受保护的成员!

于 2013-01-29T12:54:29.450 回答