首页 > 编程语言 >C++的继承

C++的继承

时间:2024-12-06 22:32:26浏览次数:9  
标签:继承 基类 C++ public Base 派生类 class

概念

在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.内存管理:

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

标签:继承,基类,C++,public,Base,派生类,class
From: https://blog.csdn.net/2302_80908313/article/details/144301365

相关文章

  • 力扣61题 -- 旋转链表(C++)
    文章目录一、题目要求二、思路分析三、代码展示一、题目要求给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:输入:head=[1,2,3,4,5],k=2输出:[4,5,1,2,3]示例2:输入:head=[0,1,2],k=4输出:[2,0,1]二、思路分析以......
  • C++——哈希表(Hash Table),附加于 Python 中字典区别于联系
    哈希表(HashTable)是一种非常高效的数据结构,用于存储键值对(key-value)。允许我们以非常快的速度进行插入、删除和查找操作,因为这些操作的时间复杂度平均为O(1)。哈希表通过使用哈希函数将键映射到表中的位置,从而实现快速访问。一、【哈希表的基本概念】1、哈希函数:这是一个将......
  • c++初识------if-else与复合语句
    上次,我们讲了简单的判断语句,今天,我们讲一些复杂的判断语句。首先,我们讲一个情景:小明在Goc课程上学会了利用pen.r指令来画椭圆,也学会了利用p.oo指令来画实心圆,今天他想利用这两个指令来画眼睛,步骤如下:第1步:画一个宽度半径是100,高度半径是40的椭圆,颜色是1号颜色。第2步:画一......
  • C++从零到进阶 ③.1循环结构(介绍)
    本次是【C++从零到进阶】的第③课(介绍):循环结构介绍我们一个个来介绍提示:介绍单吃很难吃透,需要结合后续练习跟进才能做到掌握哦!目录一、for语句1.语句格式:2.使用范例3.详细说明4.语句执行过程二、while语句1.格式2.例子三、do-while语句四、循环嵌套五、退......
  • C/C++当中的内存对齐
    一:为什么要存在内存对齐  对与计算机而言,一次性可以取出处理的单元大小为字,在32位系统下,一次性可以取出4个字节,而在64位系统下,一次性可以取出8个字节,而一个地址对应一个内存单元,如果计算机按照挨着一个字节一个字节的来存储数据,那么计算机的内存一定是最节省的状态,但是很......
  • 学习C语言升级c++的笔记
    此篇文章在2022年2月8日被记录,工作这两年多了,也没用过C++做开发,令人唏嘘1、#include<cmath>#include<cstdio>用这种方法来调用C语言中的函数2、namespace名字空间,防止命名重复::叫做限定调用符usingnamespaceX:引入整个名字空间usingX::name使用单个名字X::na......
  • 将 C++程序移植到 Android 平台
    将C++程序移植到Android平台 将C++程序移植到Android平台需要多个步骤,涉及AndroidNDK(NativeDevelopmentKit)和AndroidStudio。下面是详细的步骤指导:1.环境准备安装AndroidStudio:确保你的开发环境中安装了AndroidStudio,这是开发Android应用的主流IDE。......
  • 【c++笔试强训】(第三十二篇)
    目录数组变换(贪⼼+位运算)题目解析讲解算法原理编写代码装箱问题(动态规划-01背包)题目解析讲解算法原理编写代码数组变换(贪⼼+位运算)题目解析1.题目链接:数组变换__牛客网2.题目描述 牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是......
  • 【C++】面向对象编程知识汇总(超详细)
    【C++】面向对象编程知识汇总(超详细)文章目录【C++】面向对象编程知识汇总(超详细)一、C++类与对象1.类的基本概念1.1类的组成部分1.2对象的概念1.3注意事项2.类的访问修饰符2.1public修饰符2.2private修饰符2.3protected修饰符3.类的成员函数3.1定义成员......
  • 斗地主之顺子(Java & Python& JS & C++ & C )
    题目描述在斗地主扑克牌游戏中,扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成,且不能包含2。例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是......