为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员

Why can I print out a privately inherited member of the Base class through a publicly inhterited method of the SubBase class?

本文关键字:继承 打印 基类 成员 方法 可以通过 SubBase 为什么      更新时间:2023-10-16

StudentPerson类私下继承。这意味着受保护的公共成员和方法将被视为私有成员和函数

#include <iostream>
#include <string>
#define COUT std::cout
#define ENDL std::endl
class Person
{
protected:
std::string name;
public:
void set_name(std::string _name)
{
name = _name;
}
};
class Student : private Person
{
public:
void display()
{
COUT << "Name: " << name << ENDL;
}
void set_Student_name(std::string _name)
{
set_name(_name);
}
};
class GStudent : public Student
{
public:
void set_GStudent_name(std::string _name)
{
set_Student_name(_name);
}
};
int main(void)
{
GStudent martin;
martin.set_GStudent_name("Martin");

那么,为什么下面的代码行有效?我原以为它会抛出一个错误,因为名为display()的GStudent公共继承方法正在打印出一个不属于GSstudent类但属于Student类的私人继承方法。

martin.display();
return 0;
}

您永远不必关心方法的主体,就可以知道是否可以调用它。

您可以调用display,因为它是martin公共库的公共成员。如果Person::name是私有的,那么这条线路仍然是合法的。在这种情况下,错误将出现在Student::display正文中。

否则,这将是荒谬的。想象一下,如果你被限制只能访问具有相同访问控制的东西。您将无法构造私有成员,构造函数是从类外部调用的。你将无法阅读私人成员,因为最终你会被班外的人呼叫。所有都必须是公共的才能使用,因此没有访问控制。

std::string nameStudent类中是私有的(因此是可访问的(,因为它在Person类中受到保护。