C++ 为什么我可以通过SubBase类的公开内置方法打印出基类的私有继承成员?
学生从个人班级私下继承。这意味着受保护的和公共的成员和方法将被视为私有成员和函数C++ 为什么我可以通过SubBase类的公开内置方法打印出基类的私有继承成员?,c++,oop,C++,Oop,学生从个人班级私下继承。这意味着受保护的和公共的成员和方法将被视为私有成员和函数 #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) { nam
#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");
std::string name
在类Student
中是私有的(因此可访问),因为它在类Person
中受保护std::string name
在类Student
中是私有的(因此可访问)由于它在类Person
中受到保护,因此您不必关心方法体,就可以知道是否可以调用它
您可以调用display
,因为它是martin
公共基地的公共成员。如果Person::name
是私有的,那么这一行仍然是合法的。在这种情况下,错误将出现在Student::display
的主体中
否则就没有意义了。想象一下,如果您被限制只能使用相同的访问控制访问对象。您将无法构造私有成员,构造函数是从类外部调用的。你将无法阅读私有成员,因为最终你会被类外的东西调用。所有内容都必须是公共的才能使用,因此没有访问控制。您永远不必关心方法体,就可以知道是否可以调用它 您可以调用
display
,因为它是martin
公共基地的公共成员。如果Person::name
是私有的,那么这一行仍然是合法的。在这种情况下,错误将出现在Student::display
的主体中
否则就没有意义了。想象一下,如果您被限制只能使用相同的访问控制访问对象。您将无法构造私有成员,构造函数是从类外部调用的。你将无法阅读私有成员,因为最终你会被类外的东西调用。一切都必须是公共的才能使用,因此没有访问控制。
显示
是从学生
到学生
的公共基础,而马丁
就是一个例子。所以为什么您认为显示
无法访问?还是我在发布的代码中遗漏了一些琐碎的东西?如果是,请解释<代码>显示不是“打印出一个私有继承的方法”或任何其他方法。它正在将受保护的实例变量name
转储到std::cout
“name”在Student中是私有的,因此在GStudent中不可访问,因为私有方法和成员无法继承display()
正在从GStudent打印“name”(学生私有类成员),我认为这是不可能的,因为假定私有成员不可继承。“私有成员不可继承”-这是错误的。除非他们是朋友(这里不是这样),否则在他们成为私人的空间之外,他们是不可接近的Student
可以访问name
,因此display()
可以工作。如果将display
的原样定义移动到GStudent
,则它将失败,因为GStudent
无法访问name
;Person
到Student
的私有继承将其锁定。无论如何,不要混淆继承和可访问性。他们非常不同。如果可以,我会向上投票给你,我在评论中看不到向上投票按钮:(谢谢!display
是Student
的公共基础,这是GStudent
的一个公共基础,martin
就是一个例子。那么……你为什么认为display
无法访问?或者我在发布的代码中遗漏了一些琐碎的东西?如果是,请解释一下?display
不是“打印出私有继承的方法”或任何其他方法。它正在将受保护的实例变量name
转储到std::cout
“name”在Student中是私有的,因此在GStudent中不可访问,因为私有方法和成员无法继承。display()
正在打印“name”(Student private class成员)来自GStudent,我认为这是不可能的,因为假定私有成员是不可继承的。“私有成员是不可继承的”-这是不正确的。除非他们是朋友,否则他们在私有空间之外是不可访问的(这里不是这种情况).学生
可以访问姓名
,因此显示()
有效。如果将显示的原样定义移动到GStudent
,那么它将失败,因为GStudent
无法访问name
;将Person
的私有继承锁定到Student
。无论如何,不要将继承与可访问性混淆。它们非常不同如果可以的话,我会投票给你,我在评论中看不到投票按钮:(谢谢!
martin.display();
return 0;
}