关于C++继承权限一句话总结

一、一句话总结:派生类的访问权限不大于基类的权限,高于继承权限的属性会自动降低权限,且派生类都不能访问基类的私有属性。

二、解析

假设基类如下:

class A
{
public:
        int ccc;
	void print() const
	{
		cout<<"This is A"<<endl;
	}
protected:
	int aaa;
private:
	int bbb;
};

1、如果是公有继承,除基类的私有属性外,其他的属性都可以继承。比如:

class B : public A
{
    public:
	void print() const
        {
            cout<<"This is B"<<endl;
            cout << ccc << endl; // 可以继承基类的public属性
            cout << aaa << endl; // 也可以继承基类的protected属性
        }
};
B testb;
cout << testb.ccc; // 可以访问

2、如果是protected继承,基类的public属性权限会自动降级为protected,其他地方跟public继承一样。比如:

class C : protected A
{
    public:
	void print() const
        {
            cout<<"This is C"<<endl;
            cout << ccc << endl; // 可以继承基类的public属性,且自动转换为protected属性,所以在类内部可以访问
            cout << aaa << endl; // 也可以继承基类的protected属性
        }
};

C testc;
cout << testc.ccc; // error! 外部不能访问protected属性

如果派生类C还有派生类CC,那么CC会将基类的public当做protected处理。比如:

class CC : public C
{
    public:
	void print() const
        {
            cout<<"This is C"<<endl;
            cout << ccc << endl; // 将C继承的ccc属性当做protected处理,所以可以访问
            cout << aaa << endl; // 也可以继承基类的protected属性
        }
};

CC testcc;
cout << testcc.ccc; // error! 因为ccc被降低为protected权限了,所以不能访问

3、如果是private继承,基类的public和protected属性都会降低为private。比如:

class D : private A
{
    public:
	void print() const
        {
            cout<<"This is D"<<endl;
            cout << ccc << endl; // 可以继承基类的public属性,且自动转换为private属性,在类内部可以访问
            cout << aaa << endl; // 也可以继承基类的protected属性,且自动转换为private属性
        }
};

C testc;
cout << testc.ccc; // error! 外部不能访问private属性



打赏作者

发表评论

电子邮件地址不会被公开。 必填项已用*标注