C++ 中,面向对象编程(OOP)包括继承的概念,继承使得一个类(子类)可以继承另一个类(父类)的属性和方法。子类就可以扩展或修改父类的行为。继承是面向对象程序设计中使代码可以复用的重要手段,程序员可以在原有类特性的基础上进行扩展增加功能。通过继承,新类(派生类/子类)可以从现有类(基类/父类)中获得特征,从而达到代码复用的目的,同时也体现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。本文主要介绍C++ 面向对象 继承。

1、C++ 继承(子类和父类)

在C ++中,可以将属性和方法从一个类继承到另一个类。继承分为两类:

派生类(子类):从另一个类继承的类

基类(父类):从其继承的类

要从类继承,需要使用:符号。

例如,

#include <iostream>
using namespace std;
class MyClass {     // class
  public:           //  访问修饰符
    MyClass() {     // 构造函数
      cout << "Hello World!";
    }
};
int main() {
  MyClass myObj;    // 创建MyClass的一个对象(会调用构造函数)
  return 0;
}

2、C++ 多继承

上面的继承只是从一个基类继承,如果一个类有多个基类,这样的继承关系称为多继承。

语法:

class 派生类名: 访问控制符 基类名1,访问控制符 基类名2
{
数据成员和成员函数声明;
}

例如,

#include <iostream>
using namespace std;
//C++提供虚继承机制,防止类继承关系中成员访问的二义性。
//当类中出现virtual时,C++编译器会对象添加一个vptr指针,同时会产生一个虚函数表
class A
{
public:
    int x;  //4
public:
    A()
    {
        cout << "A" << endl;
    }
};
class B:virtual  public A
{
    int b; //4
public:
    B(int x)
    {
        this->x = 10;
        cout << "B" << endl;
    }
};
class C :virtual public A
{
    int c; //4
public:
    C(int x)
    {
        this->x = 20;
        cout << "C" << endl;
    }
};
class D :public B,public C
{
    int d; //4 
public:
    D(int x):B(10),C(20)
    {
        this->x = 30;
        cout << "D" << endl;
    }
};
int main()
{
    cout << sizeof(A) << endl;   //4
    cout << sizeof(B) << endl;   //12
    cout << sizeof(C) << endl;   //12
    cout << sizeof(D) << endl;   //24
    return 0;
}

3、继承的作用

子类可以重用父类的代码,避免重复编写。通过继承建立类之间的层次关系,体现现实世界中的“is-a”关系。不同的对象对同一消息可以产生不同的行为。继承为实现多态提供了基础。

#include <iostream>
using namespace std;

// 父类 Animal
class Animal {
public:
    void eat() {
        cout << "This animal eats food." << endl;
    }

    void sleep() {
        cout << "This animal sleeps." << endl;
    }
};

// 子类 Dog 继承 Animal 类
class Dog : public Animal {
public:
    void bark() {
        cout << "The dog barks." << endl;
    }
};

// 子类 Cat 继承 Animal 类
class Cat : public Animal {
public:
    void meow() {
        cout << "The cat meows." << endl;
    }
};

int main() {
    Dog dog;
    dog.eat();   // 继承自 Animal 类
    dog.bark();  // Dog 类自己的方法

    Cat cat;
    cat.eat();   // 继承自 Animal 类
    cat.meow();  // Cat 类自己的方法

    return 0;
}

推荐文档