欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[C++] 公有,保护和私有继承

程序员文章站 2022-03-08 20:21:40
...

1. public, protected, private:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};

// 任何code 都可以访问 publicMember
// 仅子类 (以及子类的子类) 可以访问 protectedMember
// 除了Base 自己,任何 code 都无法访问 privateMember

2. public , protected 和 private inheritance:

假定有4个类,A, B, C, D:

class A 
{
public:
    int x;
protected:
    int y;
private:
    int z;
};

class B : public A
{
    // x is public
    // y is protected
    // z is not accessible from B
};

class C : protected A
{
    // x is protected
    // y is protected
    // z is not accessible from C
};

class D : private A    // 'private' is default for classes
{
    // x is private
    // y is private
    // z is not accessible from D
};

对类中继承而来的成员的访问由 基类成员的 access level + 派生类列表中的 access label 两者共同决定。

公有继承:在派生类中基类中的 public 仍为 public, protected 为 protected

保护继承:在派生类中基类中的public和protected都变为protected

私有继承:在派生类中基类中的成员在派生类中全部变为private。

class Base {
     public:
         void basemem();   // public member
     protected:
         int i;            // protected member
         // ...
     };
     struct Public_derived : public Base {
         int use_base() { return i; } // ok: derived classes can access i
         // ...
     };
     struct Private_derived : private Base {
         int use_base() { return i; } // ok: derived classes can access i
     };

最普遍使用的继承方式为 public.

3. 默认继承方式:struct 为 public, class 为 private

class Base { /* ... */ };
struct D1 : Base { /* ... */ };   // public inheritance by default
class D2 : Base { /* ... */ };    // private inheritance by default

由于私有继承的使用极为罕见,如要使用私有继承,应该写出 private 关键字,以明确表明是要使用私有继承,而不是疏忽忘了写。

[C++ primer 15.2]   Difference between public, private, protected inheritance