41.继承的方式

程序:

#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 1
//2022年10月15日20:24:40
#include <iostream>
using namespace std;

class Father
{
public:
    int a;
private:
    int b;
protected:
    int c;
};

class Son:public Father
{
public:
    void func()
    {
        a;
        //b;//err
        c;
    }
    /*
    公有继承:
    1.类的公有属性成员,到子类还是公有(类内可以使用类外也可以使用)
    2.父类的私有属性成员,到子类还是私有
    3.父类的保护属性成员,到子类仍然是保护
    */
};

void test01()
{
    Son s1;
    s1.a;
    //s1.b;//err
    //s1.func;//err
}

//保护继承
class Son2:protected Father
{
public:
    void func()
    {
        a;
        //b;//err
        c;
        /*
        保护继承:
        1.父类的公有属性成员,到子类是保护
        2.父类的私有属性成员,到子类还是私有
        3.父类的保护属性成员,到子类还是保护
        */
    }
};

void test02()
{
    Son s2;
    //s2.a;//err
    //s2.b;//err
    //s2.c;//err
}

//私有继承
class Son3:private Father
{
public:
    void func()
    {
        a;
        //b;//err
        c;
        /*
        私有继承:
        1.父类的公有属性成员,到子类是私有
        2.父类的私有属性成员,到子类还是私有
        3.父类的保护属性成员,到子类还是保护
        */
    }
};
void test03()
{
    Son s3;
    s3.a;
    //s3.b;//err
    //s3.c;//err
}

int main()
{
    test03();
    system("pause");
    return EXIT_SUCCESS;
}

1.继承方式

三种继承方式:

■ public : 公有继承

■private : 私有继承

■protected : 保护继承

从继承源上分:

●单继承:指每个派生类只直接继承了一个基类的特征

●多继承:指多个基类派生出一个派生类的继承关系,多继承的派生类直接继承了不止一个基类的特征

2.子类对从父类继承过来的成员的权限

1.公有继承

1.父类的公有属性成员,到子类还是公有

2.父类的保护属性成员,到子类还是保护

3.父类的私有属性成员,到子类不能访问

  • 基类的publicprotected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问

  • 派生类中的成员函数可以直接访问基类中的publicprotecte成员,但不能直接访问基类的private成员。

  • 通过派生类的对象访问基类继承的成员,只能访问public成员。

    #include<iostream>
    
    using namespace std;
    
    class CFather
    {
    public:
    	int m_testA{0};
    protected:
    	int m_testB{0};
    private:
    	int m_testC{0};
    };
    
    class CSon: public CFather
    {
    	void test()
    	{
    		m_testA = 1; // 编译正确 :public 继承后,在内部或者外部都可以访问public成员
    		m_testB = 1; // 编译正确 :public 继承后,在内部可以访问protected成员
    		m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员
    	}
    };
    
    int main()
    {
    	CSon _test;
    	
    	_test.m_testA = 2; // 编译正确 :public 继承后,在内部或者外部都可以访问public成员
    	_test.m_testB = 2; // 编译错误 :public 继承后,在外部无法访问protected成员
    	_test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员
    	
    	system("pause");
    	return 0;
    }
    

2.保护继承

1.父类的公有属性成员,到子类是保护

2.父类的保护属性成员,到子类还是保护

3.父类的私有属性成员,到子类不能访问

  • 基类的publicprotected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问

  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

  • 通过派生类的对象不能直接访问从基类继承的任何成员

    #include<iostream>
    
    using namespace std;
    
    class CFather
    {
    public:
    	int m_testA{0};
    protected:
    	int m_testB{0};
    private:
    	int m_testC{0};
    };
    
    class CSon: protected CFather
    {
    	void test()
    	{
    		m_testA = 1; // 编译正确 :protected 继承后,在内部可以访问public成员
    		m_testB = 1; // 编译正确 :protected 继承后,在内部可以访问protected成员
    		m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员
    	}
    };
    
    int main()
    {
    	CSon _test;
    	
    	_test.m_testA = 2; // 编译错误 :protected 继承后,在外部无法访问public成员
    	_test.m_testB = 2; // 编译错误 :protected 继承后,在外部无法访问protected成员
    	_test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员
    	
    	system("pause");
    	return 0;
    }
    

3.私有继承

1.父类的公有属性成员,到子类还是私有

2.父类的保护属性成员,到子类还是私有

3.父类的私有属性成员,到子类不能访问

  • 基类的publicprotected成员都以private身份出现在派生类中,但基类的private成员不可直接访问

  • 派生类中的成员函数可以直接访问基类中的publicprotected成员,但不能直接访问基类的private成员。

  • 通过派生类的对象不能直接访问从基类继承的任何成员

    #include<iostream>
    
    using namespace std;
    
    class CFather
    {
    public:
    	int m_testA{0};
    protected:
    	int m_testB{0};
    private:
    	int m_testC{0};
    };
    
    class CSon: private CFather
    {
    	void test()
    	{
    		m_testA = 1; // 编译正确 :private 继承后,在内部可以访问public成员
    		m_testB = 1; // 编译正确 :private 继承后,在内部可以访问protected成员
    		m_testC = 1; // 编译错误 :无论哪种继承,都无法访问private成员
    	}
    };
    
    int main()
    {
    	CSon _test;
    	
    	_test.m_testA = 2; // 编译错误 :private 继承后,在外部无法访问public成员
    	_test.m_testB = 2; // 编译错误 :private 继承后,在外部无法访问protected成员
    	_test.m_testC = 2; // 编译错误 :无论哪种继承,都无法访问private成员
    	
    	system("pause");
    	return 0;
    }
    

    4.总结

    1.不管继承方式如何,基类中的 private 成员在派生类中始终不能使用(不能在派生类的成员函数中访问或调用)。

    2.如果希望基类的成员能够被派生类继承并且毫无障碍地使用,那么这些成员只能声明为 public 或 protected;只有那些不希望在派生类中使用的成员才声明为 private。

    3.如果希望基类的成员既不向外暴露(不能通过对象访问),还能在派生类中使用,那么只能声明为 protected。

    4.基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。再如,当继承方式为 public 时,那么基类成员在派生类中的访问权限将保持不变。

    以上来自https://blog.csdn.net/a924282761/article/details/124352983

参考资料

参考资料来源于黑马程序员等

posted @ 2022-10-15 21:05  CodeMagicianT  阅读(27)  评论(0编辑  收藏  举报