为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
Why can I print out a privately inherited member of the Base class through a publicly inhterited method of the SubBase class?
Student从Person类私下继承。这意味着受保护的公共成员和方法将被视为私有成员和函数。
#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 name
在Student
类中是私有的(因此是可访问的(,因为它在Person
类中受到保护。
相关文章:
- 如何循环打印顶点结构
- 继承函数的重载解析
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 继承期间显示未知行为的子类
- 如何在c++中打印目录
- 头文件-继承c++
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 为什么在保护模式下继承升级不起作用
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 打印所有继承的类成员变量和方法
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 多重继承,如何只打印一次共同祖先的一部分
- 从继承类打印
- 为什么继承值打印两次
- 继承和多态打印功能
- C++继承打印
- 继承示例没有打印预期的结果