【C++哲学】面向对象的三大特性之 继承

在 C++ 的 面向对象编程(OOP) 中,三大核心特性是:

封装(Encapsulation)
继承(Inheritance)
多态(Polymorphism)

继承是其中非常重要的一部分,它可以让 一个类复用另一个类的属性和行为,从而提高代码复用性和扩展性。


一、什么是继承(Inheritance)

继承指的是:
一个类(子类 / 派生类)可以继承另一个类(父类 / 基类)的成员变量和成员函数。

基本思想:

父类:通用属性
子类:扩展功能

例如:

动物 Animal
   |
   ├── 狗 Dog
   └── 猫 Cat

Dog 和 Cat 可以继承 Animal 的通用行为。


二、继承的基本语法

在 C++ 中继承的基本语法:

class 子类名 : 继承方式 父类名
{
};

示例:

#include <iostream>
using namespace std;

class Animal {
public:
    void eat() {
        cout << "Animal eating" << endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "Dog barking" << endl;
    }
};

int main() {

    Dog d;

    d.eat();
    d.bark();

    return 0;
}

输出:

Animal eating
Dog barking

说明:

Dog继承了Animal的eat()函数

三、继承方式(重点)

在 C++ 中有 三种继承方式

继承方式父类public父类protected父类private
public继承publicprotected不可访问
protected继承protectedprotected不可访问
private继承privateprivate不可访问

1 public继承(最常用)

特点:

父类public → 子类public
父类protected → 子类protected

示例:

class Base {
public:
    int a;
protected:
    int b;
};

class Derived : public Base {
};

访问情况:

Derived可以访问a和b
外部对象只能访问a

2 protected继承

规则:

父类public → 子类protected
父类protected → 子类protected

示例:

class Derived : protected Base
{
};

特点:

外部对象无法访问Base成员

3 private继承

规则:

父类public → 子类private
父类protected → 子类private

示例:

class Derived : private Base
{
};

特点:

父类成员对子类私有

四、继承中的构造函数

子类创建对象时,父类构造函数会先执行

示例:

#include <iostream>
using namespace std;

class Base {

public:

    Base() {
        cout << "Base constructor" << endl;
    }
};

class Derived : public Base {

public:

    Derived() {
        cout << "Derived constructor" << endl;
    }
};

int main() {

    Derived d;

}

输出:

Base constructor
Derived constructor

顺序:

父类构造 → 子类构造

析构顺序:

子类析构 → 父类析构

五、继承中的成员同名问题

如果子类和父类有同名成员:

示例:

class Base {
public:
    int num = 10;
};

class Derived : public Base {
public:
    int num = 20;
};

访问:

Derived d;

cout << d.num << endl;
cout << d.Base::num << endl;

输出:

20
10

说明:

子类成员会隐藏父类成员

六、多继承

C++ 支持一个类继承多个父类。

示例:

class A {
public:
    void funcA() {
        cout << "A" << endl;
    }
};

class B {
public:
    void funcB() {
        cout << "B" << endl;
    }
};

class C : public A, public B {
};

使用:

C c;

c.funcA();
c.funcB();

七、菱形继承(经典问题)

结构:

        A
       / \
      B   C
       \ /
        D

问题:

D会继承A两次

解决方案:

使用 虚继承(virtual inheritance)

示例:

class A {
public:
    int num;
};

class B : virtual public A {
};

class C : virtual public A {
};

class D : public B, public C {
};

这样:

D只保留一份A

八、继承的优点

继承的核心优势:

1️⃣ 代码复用

避免重复代码。

2️⃣ 层次结构清晰

动物 → 哺乳动物 → 狗

3️⃣ 方便扩展

新增子类即可。


九、继承的缺点

继承也存在一些问题:

1️⃣ 耦合度高

子类依赖父类。

2️⃣ 层级过深难维护

A → B → C → D → E

3️⃣ 多继承复杂

可能产生菱形问题。


十、继承 vs 组合

软件设计中常有一句经典原则:

优先使用组合,而不是继承

继承:

is-a

例如:

Dog is a Animal

组合:

has-a

例如:

Car has a Engine

总结

C++继承核心知识:

继承三要点
├── 继承语法
├── 三种继承方式
└── 构造与析构顺序

重要概念:

public继承(最常用)
多继承
菱形继承
虚继承

一句话理解:

继承就是在已有类基础上扩展新功能,实现代码复用。


如果你愿意,我可以再给你整理一份 C++面向对象核心知识(封装 + 继承 + 多态 + 虚函数)一张图彻底讲清楚,很多 C++ 面试都会考。

文章已创建 5074

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部