Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我可以通过SubBase类的公开内置方法打印出基类的私有继承成员?_C++_Oop - Fatal编程技术网

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;
}