C++类继承方法及友元类联系与区别 [学习笔记]

在C++中,类的继承方式主要有三种:公有继承(public inheritance)保护继承(protected inheritance)私有继承(private inheritance)。它们主要决定了基类成员在派生类中的访问权限。以下是详细的联系与区别:


1. 公有继承 (public)

  • 规则
    • 基类的 public 成员在派生类中仍然是 public
    • 基类的 protected 成员在派生类中仍然是 protected
    • 基类的 private 成员在派生类中不可直接访问。
  • 用途
    • 表示 “是一个”(is-a)的关系。例如:CarVehicle
    • 用于建立一个外界可见的继承关系,基类接口可以通过派生类直接使用。
  • 示例
    class Base {
    public:
        int pub;
    protected:
        int prot;
    private:
        int priv;
    };
    
    class Derived : public Base {
        // pub 是 public
        // prot 是 protected
        // priv 不可访问
    };
    

2. 保护继承 (protected)

  • 规则
    • 基类的 publicprotected 成员在派生类中都变为 protected
    • 基类的 private 成员仍然不可直接访问。
  • 用途
    • 保护继承限制了外界对派生类中基类成员的访问。
    • 常用于不希望继承关系暴露给外部,但仍然允许派生类或子类访问。
  • 示例
    class Base {
    public:
        int pub;
    protected:
        int prot;
    private:
        int priv;
    };
    
    class Derived : protected Base {
        // pub 和 prot 变为 protected
        // priv 不可访问
    };
    

3. 私有继承 (private)

  • 规则
    • 基类的 publicprotected 成员在派生类中都变为 private
    • 基类的 private 成员仍然不可直接访问。
  • 用途
    • 表示 “通过实现获得”(is-implemented-in-terms-of)的关系,而不是 “是一个” 关系。
    • 常用于内部实现细节隐藏,外界完全不知道继承的存在。
  • 示例
    class Base {
    public:
        int pub;
    protected:
        int prot;
    private:
        int priv;
    };
    
    class Derived : private Base {
        // pub 和 prot 变为 private
        // priv 不可访问
    };
    

联系与区别总结

继承方式基类成员在派生类的访问权限特点外部访问基类成员用途
publicpublic -> public
protected -> protected
外部可见的继承关系可以通过派生类访问“是一个” 关系(is-a)
protectedpublic -> protected
protected -> protected
内部继承,外部看不到继承关系不可通过派生类访问限制继承暴露
privatepublic -> private
protected -> private
完全隐藏的继承关系,强内聚不可通过派生类访问“实现关系”(implementation)

注意事项

  1. 虚函数与继承方式

    • 无论哪种继承方式,虚函数的多态行为依然有效,只要基类成员函数是 publicprotected
  2. 友元关系

    • 基类的友元关系不会因为继承方式发生变化。
  3. 多重继承冲突

    • 如果多个基类中有同名成员,可能需要显式解决冲突。

根据需求选择合适的继承方式,可以更好地组织代码,提升可读性与可维护性。

在C++中,类继承友元类都用于建立类之间的关系,但它们的目的和实现方式不同,作用范围也不同。以下是二者的详细对比与联系:


友元类

定义

友元类是通过 friend 关键字声明的,它可以直接访问另一个类的所有成员,包括私有和保护成员。

特点

  1. 无继承关系:友元类之间没有层次关系,只是单向授权访问。
  2. 访问权限广泛:友元类可以访问目标类的所有成员,包括 privateprotected
  3. 不影响目标类的权限体系:目标类的其他类或派生类成员访问权限不变。
  4. 是一种紧耦合的设计:友元类破坏了封装性,需要谨慎使用。

用途

  • 用于实现紧密协作的两个类之间的关系。
  • 当某些操作需要访问另一个类的内部实现但不需要继承时使用。

示例

class ClassA {
private:
    int secret;
public:
    ClassA(int value) : secret(value) {}
    friend class ClassB; // 声明 ClassB 为友元类
};

class ClassB {
public:
    void reveal(ClassA& a) {
        // 友元类可以直接访问 private 成员
        std::cout << "Secret value is: " << a.secret << std::endl;
    }
};

类继承与友元类的对比

特性类继承友元类
关系类型层次化关系,父类与子类授权访问,无层次化关系
访问权限受继承方式限制(publicprotectedprivate无限制,可以访问 privateprotected
多向性单向:子类从父类继承单向:目标类授权给友元类
多态性支持虚函数和动态多态不支持
作用范围子类通过继承获得基类功能友元类仅能访问目标类内部实现
用途实现 “是一个” 的层次结构(is-a)紧密协作类,临时性访问需求
对封装的影响保持封装性,但访问受权限限制破坏封装性,允许直接访问私有成员

类继承与友元类的联系

  1. 都可以实现访问私有成员的能力

    • 类继承通过 protected 成员和受限访问。
    • 友元类通过直接授权访问私有成员。
  2. 都用于增强类之间的交互

    • 类继承实现功能扩展。
    • 友元类实现功能协作。
  3. 都可以在特定条件下破坏封装性

    • 类继承可能导致子类访问超出需要的基类成员。
    • 友元类直接暴露所有私有成员,破坏封装性更强。

如何选择?

  • 选择类继承

    • 当需要表示 “是一个” 的关系。
    • 当需要复用基类代码和接口。
    • 当需要多态功能。
  • 选择友元类

    • 当两个类之间需要紧密协作。
    • 当类之间没有层次关系,但需要访问私有成员。
    • 当不希望外界知道类间关系。

使用时需权衡封装性和功能需求,避免滥用友元类,以减少代码的耦合性和维护难度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值