c++继承中的访问权限


 
#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函数中都不能访问
这样理解对吗

简单总结下,你对照着理解下:

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/273589
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++中public、protected、private三种权限继承详解
  • 除此之外, 这篇博客: c++ 继承 及 派生类的默认成员函数解析中的 继承与转换–赋值兼容性规则–public继承 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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;
    }
    

  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的解释,对于类的定义中的访问说明符的位置和次数是没有限制的。每个访问说明符都会指定接下来的成员的访问级别,在下一个访问说明符出现或者到达类的结尾之前都有效。

    通常情况下,构造函数和一部分成员函数应该定义在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++中,继承通过不同的访问权限来控制派生类对基类成员的访问的情况,并通过代码示例验证了这个问题的答案。