为什么我的对象无法访问在公共基类中定义的另一个对象的受保护成员?
Why can't my object access protected members of another object defined in common base class?
以下代码产生编译器错误:
"BaseTest::_protMember":无法访问中声明的受保护成员类"BaseTest"
为什么我不能访问class SubTest
中的成员变量_protMember
,即使它受到保护?
class BaseTest
{
public:
BaseTest(){};
BaseTest(int prot)
{
_protMember = prot;
};
protected:
int _protMember;
};
class SubTest : public BaseTest
{
// followup question
SubTest(const SubTest &subTest)
{
_protMember = subTest._protMember; // this line compiles without error
};
SubTest(const BaseTest &baseTest)
{
_protMember = baseTest._protMember; // this line produces the error
};
};
后续问题:
为什么在添加的复制构造函数中,我可以访问另一个实例的受保护成员?
您只能从自己的基类实例访问protected
成员。。。而不是作为参数提供给您的。实际上,这一切都与OO封装有关。如果没有这个限制,正在构建的对象可能会使baseTest&
参数的不变量无效。
换句话说,您的SubTest
可能会决定使用与另一个BaseTest
派生类(比如SubTest2 : BaseTest
)对同一成员的使用冲突的protected
成员。如果您的SubTest
代码被允许篡改其他对象的数据,它可能会使SubTest2
对象中的不变量无效,或者获取一些值,这些值在预期的封装中仅用于暴露于SubTest2
和(可选地,见下文)SubTest2
导数。
跟进问题:为什么在添加的副本构造函数中,我可以访问另一个实例的受保护成员?
SubTest(const SubTest& x); // can access x._protMember
SubTest(const BaseTest& x); // cannot access x._protMember
上面同样的见解解释了为什么允许这样做:复制构造函数获得SubTest&
,而不仅仅是从BaseTest
派生的任何旧对象,而且这个构造函数显然在SubTest
抽象中。假定SubTest
编码器熟悉SubTest
所提供的预期设计/封装,并且拷贝构造函数也被授予绕过并在另一个SubTest&
对象上强制执行后置条件/不变量的权限。(您正在从一个对象复制,该对象本身可能是由相同的函数复制构建的,因此在"*this
"侧而不是在ref侧保护它根本没有多大保护作用,甚至忽略了您可能想要/需要该访问的所有合理原因)。
CCD_ 20派生的对象可能会意外地传递给CCD_ 21复制构造函数("切片"),但即使在这种情况下,SubTest&
类也可以控制进一步派生的对象是否会对_protMember
做任何意外的事情——如果它想"最终确定"对_protMember
的访问并禁止任何派生类使用它,则添加private
using BaseTest::_protMember;
语句
只能在类实例中访问protected
成员。即:
class SubTest : public BaseTest
{
SubTest(const BaseTest &baseTest)
{
_protMember = baseTest._protMember;
// ^^^^^^^^^^^ Is good because you are in the instance of its class
_protMember = baseTest._protMember;
// ^^^^^^^^^^^^^^^^^^^^^ Produce error because you are not in the baseTest instance.
};
// followup question
SubTest(const SubTest &subTest)
{
_protMember = subTest._protMember;
// Compile because access modifiers work on class level, and not on object level.
};
};
编辑后续内容:
访问修饰符在类级别上工作,而不是在对象级别上工作。
也就是说,同一类的两个对象可以访问彼此的私有成员。
这是我的来源:为什么我可以访问复制构造函数中的私有变量?
通过将_protMember
定义为protected
,允许派生类的对象访问它们自己的_protMember
。这并不意味着派生类的所有对象都可以访问其他对象的_protMember
。
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- 在C++中,我想通过使用来自变量(例如字符串)的typename信息,从模板中定义一个类对象
- 是否可以定义一个非模板函数,该函数可以将模板化对象作为参数
- 如何在用户定义类型的向量上使用 vector::p ush_back() 来仅修改一个对象?
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 通过"this"访问另一个对象的定义?
- 定义一个函数使用可调用对象作为参数
- 在C++中,"static initialization fiasco"是否仅影响对另一个模块中定义的对象的数据成员的引用?
- 自定义内存管理,用于在文件中每行创建一个对象
- 我可以定义一个指向 std::function 类型的对象的函数指针吗?
- 是否应该为具有指向其父对象的指针的对象定义一个复制构造函数
- 为每个对象定义一个唯一的函数
- 将自定义类型传递给另一个对象后,如何访问该类型
- 我如何定义一个向量,并用C++在其中存储对象
- 为什么我的对象无法访问在公共基类中定义的另一个对象的受保护成员?
- 从另一个对象调用一个对象的函数时未定义的引用
- 定义一个派生类BaseClass对象;不工作
- 如何在OpenMP中定义一个对象或结构为线程私有
- 在.cpp文件中定义一个对象
- 定义一个对象有什么区别;s成员的值、指针或引用