自学内容网 自学内容网

C++的继承

概念

在C++中,继承是面向对象编程的一个重要特性,它允许一个类(派生类)从另一个类(基类)继承属性和方法,从而实现代码的重用和扩展。

  • 基类(Base Class):被继承的类。
  • 派生类(Derived Class):从基类派生出的类。-

继承类型

  • 公有继承(Public Inheritance):

    • 派生类可以访问基类的公有成员和保护成员。
    • 基类的私有成员仍然不可被访问。
class Base {  
public:  
    void pubFunc() { /* ... */ }  
protected:  
    void protFunc() { /* ... */ }  
private:  
    void privFunc() { /* ... */ }  
};  

class Derived : public Base {  
    void accessBase() {  
        pubFunc();   // 可以访问  
        protFunc();  // 可以访问  
        // privFunc(); // 不可访问  
    }  
};
  • 保护继承(Protected Inheritance):

    • 派生类可以访问基类的公有和保护成员,但基类的公有成员在派生类外部被视为保护成员。
class Derived : protected Base {  
    void accessBase() {  
        pubFunc();   // 可以访问  
        protFunc();  // 可以访问  
    }  
};
  • 私有继承(Private Inheritance):

    • 派生类只能访问基类的成员,其它类无法访问基类的公有和保护成员。
class Derived : private Base {  
    void accessBase() {  
        pubFunc();   // 可以访问  
        protFunc();  // 可以访问  
    }  
};

构造函数和析构函数

  • 派生类的构造函数会先调用基类的构造函数。
  • 如果基类有构造函数,派生类必须在初始化列表中显式调用基类的构造函数(如果没有默认构造函数)。
class Base {  
public:  
    Base(int x) { /* ... */ }  
};  

class Derived : public Base {  
public:  
    Derived(int x) : Base(x) { /* ... */ }  
};

方法重写(Overriding)

派生类可以重写基类中的虚函数。使用virtual关键字在基类中声明函数,在派生类中实现相同的函数名称和签名。

class Base {  
public:  
    virtual void show() { std::cout << "Base show" << std::endl; }  
};  

class Derived : public Base {  
public:  
    void show() override { std::cout << "Derived show" << std::endl; }  
};

多重继承

C++支持多重继承,即一个类可以继承多个基类。

class Base1 {  
public:  
    void func1() { /* ... */ }  
};  

class Base2 {  
public:  
    void func2() { /* ... */ }  
};  

class Derived : public Base1, public Base2 {  
public:  
    void useBase() {  
        func1();  
        func2();  
    }  
};

虚基类

在多重继承时,可能会导致“菱形继承”问题。虚基类用于解决这个问题,确保只有一个基类实例。

class Base {  
public:  
    Base() { std::cout << "Base Constructor" << std::endl; }  
};  

class Derived1 : virtual public Base {};  
class Derived2 : virtual public Base {};  

class Final : public Derived1, public Derived2 {};

继承的好处

1.代码重用:

  • 派生类可以重用基类中的数据成员和方法,减少代码冗余,提升开发效率。

2.扩展性:

  • 通过继承,您可以轻松添加新功能,只需创建派生类并实现或重写所需的方法,而无需修改基类。

3.多态性:

  • 继承与虚函数结合使用,可以实现多态性。允许通过基类指针或引用操作派生类对象,从而实现不同的行为。

4.层次结构设计:

  • 继承可以帮助建立清晰的类层次结构,反映现实世界的关系,使程序更易理解和维护。

5.接口一致性:

  • 基类定义的接口可以被多个派生类共享,确保不同类之间的统一性和可互换性。

注意事项

  • 1.菱形继承问题:

    • 当一个类有多个基类时,可能导致继承链中的多个基类实例(菱形继承)。使用虚基类可以解决此问题。
class Base {  
public:  
    void func() { /* ... */ }  
};  

class Derived1 : virtual public Base {};  
class Derived2 : virtual public Base {};  

class Final : public Derived1, public Derived2 {};
  • 2.访问控制:

    • 注意基类成员的访问控制。公有继承、保护继承和私有继承对派生类的访问权限影响不同,要谨慎选择。

+3. 构造函数和析构函数:

  • 派生类构造函数会调用基类构造函数。确保在构造函数中正确初始化基类,必要时显式调用基类构造函数。

  • 4.方法重写(Overriding):

    • 在派生类中重写基类方法时,确保使用override关键字,以提高代码的可读性和安全性。如果基类方法不是虚拟的,派生类将无法重写。

+5. 设计原则:

  • 在设计类之间的关系时,遵循“is-a”关系,即派生类应当是一种基类的特例,而不是“has-a”关系(组合关系)。

  • 6.过度使用继承:

    • 过度使用继承可能导致复杂的类结构和难以维护的代码。考虑使用组合(Composition)作为替代方案,在许多情况下,这更简单、更灵活。
  • 7.内存管理:

    • 在多重继承中,可能需要仔细管理内存分配和释放。尤其是带有虚函数的类,确保使用适当的资源管理策略。

原文地址:https://blog.csdn.net/2302_80908313/article/details/144301365

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!