访问基类对象中的受保护成员
Accessing protected members in base class objects
考虑:
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()
也可以这样做!这样你就可以实际修改受保护的成员!
相关文章:
- C++:无法访问声明的受保护成员
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 派生类如何使用基类的受保护成员
- 访问派生类C++中的受保护成员
- 访问基类的受保护成员
- 如何访问多个继承类中的受保护成员
- 如何从另一个类的基类访问派生类中的受保护成员
- 无法访问派生类中的基本受保护成员!(在虚函数中)
- 如何通过派生类访问基类的受保护成员?
- 如果孩子不需要父母班级的所有受保护成员,这是不好的班级设计吗?