C++ 公共、受保护和私有继承

C++继承中,可以通过不同的访问方式从基类派生出子类。

class Base {
.... ... ....
};

class Derived : public Base {
.... ... ....
};

在公共模式下从基类创建了一个派生类。或者,也可以在保护或私有模式下派生类。

这 3 个关键字(public、protected 和 private)在 C++ 继承中称为访问说明符。

C++中的公共、保护和私有继承

publicprotectedprivate继承具有以下特点:

  • 公共继承使得基类的公共成员在派生类中是公共的,而基类的受保护成员在派生类中仍然是受保护的。
  • 受保护继承使基类的公共成员和受保护成员在派生类中受到保护。
  • 私有继承使基类的公共成员和受保护成员在派生类中成为私有成员。

Note:派生类无法访问基类的私有成员。

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

class PublicDerived: public Base {
  // x公共
  // y受保护
  // 无法从公共派生访问Z
};

class ProtectedDerived: protected Base {
  // x受保护
  // y受保护
  //无法从受保护派生访问Z
};

class PrivateDerived: private Base {
  // x私有
  // y私有
  // 无法从私有派生访问Z
};

示例 1:C++ 公共继承

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;

protected:
    int prot = 2;

public:
    int pub = 3;

    // 用于访问私有成员的函数
    int getPVT() {
        return pvt;
    }
};

class PublicDerived : public Base {
public:
    //从基类访问受保护成员的函数
    int getProt() {
        return prot;
    }
};

int main() {
    PublicDerived object1;
    cout << "Private = " << object1.getPVT() << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.pub << endl;
    return 0;
}

结果:

 由于 private 和 protected 成员不能从 main() 访问,需要创建公共函数 getPVT() 和 getProt() 来访问它们:

// 错误:成员“Base::pvt”不可访问
cout << "Private = " << object1.pvt;

// 错误:成员“Base::prot”不可访问
cout << "Protected = " << object1.prot;

示例 2:C++ 保护的继承

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;

protected:
    int prot = 2;

public:
    int pub = 3;

    // 用于访问私有成员的函数
    int getPVT() {
        return pvt;
    }
};

class ProtectedDerived : protected Base {
public:
    // 从基类访问受保护成员的函数
    int getProt() {
        return prot;
    }

    // 从基类访问公共成员的函数
    int getPub() {
        return pub;
    }
};

int main() {
    ProtectedDerived object1;
    cout << "私有无法访问。" << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

结果:

 众所周知,受保护的成员不能从类外部直接访问。因此,无法使用 ProtectedDerived 中的 getPVT()。

// 错误:成员“Base::getPVT()”不可访问
cout << "Private = " << object1.getPVT();

// 错误:成员“Base::pub”不可访问
cout << "Public = " << object1.pub;

示例 3:C++ 私有继承

#include <iostream>
using namespace std;

class Base {
private:
    int pvt = 1;

protected:
    int prot = 2;

public:
    int pub = 3;

    // 用于访问私有成员的函数
    int getPVT() {
        return pvt;
    }
};

class PrivateDerived : private Base {
public:
    // 从基类访问受保护成员的函数
    int getProt() {
        return prot;
    }

    // 用于访问私有成员的函数
    int getPub() {
        return pub;
    }
};

int main() {
    PrivateDerived object1;
    cout << "私有无法访问。" << endl;
    cout << "Protected = " << object1.getProt() << endl;
    cout << "Public = " << object1.getPub() << endl;
    return 0;
}

结果:

私有成员不能从类外直接访问。因此,无法使用 PrivateDerived 中的 getPVT()。

// 错误:成员“Base::getPVT()”不可访问
cout << "Private = " << object1.getPVT();

// 错误:成员“Base::pub”不可访问
cout << "Public = " << object1.pub;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三千思丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值