c语言编程笔录

首页 >   > 笔记大全

笔记大全

C++类扩展之继承和组合怎么应用

更新时间:2023-10-23

前言:

在C++中,类的扩展可以通过继承和组合来实现。继承是指一个类可以继承另一个类的成员变量和成员函数,以及一些类间的关系。组合是指一个类可以包含其他类的对象作为其成员变量,从而实现了对其他类的复用。继承和组合是面向对象编程中常用的两种关系,不同的应用场景下,可以根据需要灵活选择使用。

继承的应用:

继承用于实现类与类之间的关系,在一个类继承另一个类时,继承类会具有被继承类的成员变量和成员函数。继承分为单继承和多继承两种方式。 单继承指一个类只能继承一个基类,通过继承可以获取到基类的属性和方法,并且可以重写基类的方法。例如,有一个Animal基类,定义了动物的基本属性和方法,然后可以创建Dog和Cat派生类来继承Animal类,并分别实现不同种类动物的特殊属性和方法。可以在Dog类中重写Animal类的eat方法,以适应狗的饮食习惯。
class Animal {
public:
    virtual void eat() {
        std::cout << "Animal is eating..." << std::endl;
    }
};

class Dog : public Animal {
public:
    void eat() override {
        std::cout << "Dog is eating bones..." << std::endl;
    }
};
多继承指一个类可以同时继承多个基类。这在某些情况下可以有效地实现多个类的复用。例如,有一个Student类和一个Worker类,分别表示学生和工人的属性和方法,而一个Person类可以同时继承Student和Worker类,表示一个既是学生又是工人的人。使用多继承时,需要注意解决多个基类中可能出现的命名冲突问题,并避免菱形继承导致的二义性问题。
class Student {
public:
    void study() {
        std::cout << "Student is studying..." << std::endl;
    }
};

class Worker {
public:
    void work() {
        std::cout << "Worker is working..." << std::endl;
    }
};

class Person : public Student, public Worker {
public:
    // Person可以同时使用Student和Worker的方法
};

组合的应用:

组合用于通过在一个类中包含另一个类的对象实现类的扩展。通过组合,一个类可以获取到另一个类的属性和方法,并且可以通过调用包含类的对象来间接调用被包含类的方法。组合是一种较为灵活的类扩展方式,可以根据需要灵活选择使用。 例如,有一个Car类表示汽车,而一个Engine类表示汽车的引擎,Car类可以通过组合包含Engine对象,从而具备了引擎的属性和方法。通过调用Car类的方法,可以直接或间接调用Engine类的方法。
class Engine {
public:
    void start() {
        std::cout << "Engine starts..." << std::endl;
    }
};

class Car {
private:
    Engine engine;

public:
    void start() {
        engine.start();
        std::cout << "Car starts..." << std::endl;
    }
};
组合还可以实现更复杂的类之间的关系。例如,一个公司类可以通过组合包含多个员工对象,从而实现对员工的管理。每个员工对象又可以包含其他对象作为其成员变量,以实现更细粒度的功能划分和复用。

总结:

继承和组合是C++中常用的类扩展方式。继承适用于类与类之间的关系,通过继承可以获取到基类的属性和方法,并可以重写基类的方法。组合适用于类与对象之间的关系,通过组合可以包含其他类的对象作为其成员变量,从而实现对其他类的复用。根据具体的应用场景和需求,可以选择灵活使用继承和组合来实现类的扩展。在使用继承时,需要注意多继承可能导致的命名冲突和二义性问题;在使用组合时,可以通过类的成员变量来间接调用被包含类的方法,实现更高级别的功能。