#include<iostream>
using namespace std;
// 基类 Base
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
// 公有继承
class PublicDerived : public Base {
public:
void accessBaseMembers() {
publicMember = 1; // 可以直接访问公有成员
protectedMember = 2; // 可以直接访问保护成员
//privateMember = 3; // 无法直接访问私有成员
}
};
// 私有继承
class PrivateDerived : private Base {
public:
void accessBaseMembers() {
publicMember = 1; // 无法直接访问公有成员
protectedMember = 2; // 无法直接访问保护成员
//privateMember = 3; // 无法直接访问私有成员
}
};
// 保护继承
class ProtectedDerived : protected Base {
public:
void accessBaseMembers() {
publicMember = 1; // 无法直接访问公有成员
protectedMember = 2; // 无法直接访问保护成员
//privateMember = 3; // 无法直接访问私有成员
}
};
int main() {
PublicDerived obj1;
obj1.accessBaseMembers();
cout << obj1.publicMember << endl;
/*cout << obj1.privateMember << endl;
cout << obj1.protectedMember << endl;
*/
PrivateDerived obj2;
obj2.accessBaseMembers();
/*cout << obj2.publicMember << endl;
cout << obj2.privateMember << endl;
cout << obj2.protectedMember << endl;*/
ProtectedDerived obj3;
obj3.accessBaseMembers();
/* cout << obj3.publicMember << endl;
cout << obj3.privateMember << endl;
cout << obj3.protectedMember << endl*/
}
大致意思是:在public继承类中可以访问public、protected成员,在main函数中只能访问public成员
在protected、private的继承类中可以访问public、protected成员,在main函数中都不能访问
这样理解对吗
简单总结下,你对照着理解下:
1.子类对象可以赋值给父类对象(切割/切片)
2.父类对象不能赋值给子类对象
3.父类指针/引用可以指向子类对象
4.子类指针/引用不可以指向父类对象
来看下面这张图:
class Person
{
public :
void Display ()
{
cout<<_name <<endl;
}
protected :
string _name ; // 姓名
};
class Student : public Person
{
public :
int _num ; // 学号
};
void Test ()
{
Person p ;
Student s ;
// 1.子类对象可以赋值给父类对象(切割 /切片)
p = s ;
// 2.父类对象不能赋值给子类对象
//s = p;
// 3.父类的指针/引用可以指向子类对象
Person* p1 = &s;
Person& r1 = s;
// 4.子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)
Student* p2 = (Student*)& p;
Student& r2 = (Student&) p;
// 这里会发生什么?
p2->_num = 10;
r2._num = 20;
}
根据参考资料中的解释,对于类的定义中的访问说明符的位置和次数是没有限制的。每个访问说明符都会指定接下来的成员的访问级别,在下一个访问说明符出现或者到达类的结尾之前都有效。
通常情况下,构造函数和一部分成员函数应该定义在public说明符之后,作为类的接口的一部分,可以让其他类或者对象直接访问。而数据成员和作为实现部分的函数应该定义在private说明符之后,作为类的实现细节,只能在类的内部访问。
接下来,以一个例子来验证一下这个问题:
#include <iostream>
class Base {
public:
int publicMember;
protected:
int protectedMember;
private:
int privateMember;
};
class Derived: public Base {
};
int main() {
Derived d;
d.publicMember = 1; // 可以访问基类的public成员
std::cout << d.publicMember << std::endl;
// d.protectedMember = 2; // 无法访问基类的protected成员
// d.privateMember = 3; // 无法访问基类的private成员
return 0;
}
在以上的代码中,我们定义了一个基类Base,其中有一个public成员publicMember,一个protected成员protectedMember和一个private成员privateMember。然后定义了一个派生类Derived通过public继承Base。
在main函数中,我们创建了一个Derived对象d,并尝试访问基类的成员。根据问题描述,我们可以发现在public继承的情况下,派生类可以访问基类的public和protected成员。因此,我们成功地通过d.publicMember = 1对基类的public成员进行了赋值,并输出了结果。
然后,我们尝试访问基类的protected成员和private成员。根据问题描述,我们无法在main函数中直接访问基类的protected成员和private成员。因此,我们注释掉了d.protectedMember = 2和d.privateMember = 3这两行。如果尝试运行这段代码,会得到编译错误。
综上所述,我们确认了在C++中,继承通过不同的访问权限来控制派生类对基类成员的访问的情况,并通过代码示例验证了这个问题的答案。