c++中各种类的继承关系

template <typename T>
class BASIC
{
public:
    void public_fun();
    T public_data_;
protected:
    void protected_fun();
    T protected_data_;
private:
    void private_fun();
    T private_data_;
}

公有继承

class CHILD : public BASIC

基类中的公有成员在子类中仍然是公有成员,保护成员在子类中是保护成员,私有成员在子类中不可访问。

class CHILD :public BASIC<int>
{
public:
    void fun();
}

CHILD::fun() {
    printf("%d\n", public_data_); // 正确
    printf("%d\n", protected_data_); // 正确
    printf("%d\n", private_data_); // 错误

    public_fun(); // 正确
    protected_fun(); // 正确
    private_fun(); // 错误
}

int main() {
    CHILD child;
    child.public_data_; // 正确
    child.protected_data_; // 错误
    chlid.private_data_; //错误

    child.public_fun(); // 正确
    child.protected_fun(); // 错误
    child.private_fun(); // 错误
    return 0;
}

私有继承

class CHILD : private BASIC

基类的公有和保护成员在子类中变为私有成员,基类的私有成员在子类中不可访问

class CHILD :private BASIC<int>
{
public:
    void fun();
}

CHILD::fun() {
    printf("%d\n", public_data_); // 正确
    printf("%d\n", protected_data_); // 正确
    printf("%d\n", private_data_); // 错误

    public_fun(); // 正确
    protected_fun(); // 正确
    private_fun(); // 错误
}

int main() {
    CHILD child;
    child.public_data_; // 错误
    child.protected_data_; // 错误
    chlid.private_data_; //错误

    child.public_fun(); // 错误
    child.protected_fun(); // 错误
    child.private_fun(); // 错误
    return 0;
}

保护继承

class CHILD : protected BASIC

基类的公有和保护成员在子类中变为保护成员,私有成员在子类中不可访问

class CHILD :protected BASIC<int>
{
public:
    void fun();
}

CHILD::fun() {
    printf("%d\n", public_data_); // 正确
    printf("%d\n", protected_data_); // 正确
    printf("%d\n", private_data_); // 错误

    public_fun(); // 正确
    protected_fun(); // 正确
    private_fun(); // 错误
}

int main() {
    CHILD child;
    child.public_data_; // 错误
    child.protected_data_; // 错误
    chlid.private_data_; //错误

    child.public_fun(); // 错误
    child.protected_fun(); // 错误
    child.private_fun(); // 错误
    return 0;
}

其实可以看到保护继承和私有继承中子类的权限有些类似,但是私有继承无法将子类对象传给基类对象,也就是无法使用基类指针来指向子类指针。

虚继承

class CHILD : virtual public BASIC

虚公有继承主要用于解决菱形继承问题,在菱形继承的子类中只会保存一份父类的副本,可以解决菱形继承带来的内存浪费和二义性问题(非必要不要使用菱形继承结构)。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值