Bootstrap

C++面向对象三大特性

一、封装


封装是将数据和操作数据的函数捆绑在一起形成类,通过访问控制限定符(如private、protected、public)隐藏对象的内部细节,仅对外提供必要接口,以此增强代码的安全性和可维护性。

#include <iostream>

class BankAccount {
private:
    double balance;  // 私有成员变量,外部无法直接访问

public:
    // 构造函数,用于初始化账户余额
    BankAccount(double initialBalance) : balance(initialBalance) {}

    // 存款方法
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            std::cout << "存款 " << amount << " 元成功,当前余额: " << balance << " 元" << std::endl;
        } else {
            std::cout << "存款金额必须大于 0" << std::endl;
        }
    }

    // 取款方法
    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            std::cout << "取款 " << amount << " 元成功,当前余额: " << balance << " 元" << std::endl;
        } else {
            std::cout << "取款金额无效或余额不足" << std::endl;
        }
    }
};

int main() {
    BankAccount account(1000);
    account.deposit(500);
    account.withdraw(200);
    return 0;
}

 代码解释
在这个例子中,BankAccount类把balance设为私有成员变量,外部无法直接访问它。而deposit和withdraw方法是公共的,外部可以调用它们来操作账户余额,这就实现了数据的封装。

 二、继承


继承允许一个类(派生类 / 子类)继承另一个类(基类 / 父类)的属性和方法,从而实现代码复用与扩展。子类能够继承父类的特性,还能添加自身的特性或者重写父类的方法。

#include <iostream>

// 基类
class Shape {
protected:
    double area;

public:
    // 纯虚函数,用于计算面积,派生类必须实现
    virtual void calculateArea() = 0;

    // 获取面积的方法
    double getArea() {
        return area;
    }
};

// 派生类:圆形
class Circle : public Shape {
private:
    double radius;

public:
    // 构造函数,初始化半径
    Circle(double r) : radius(r) {}

    // 重写基类的纯虚函数,计算圆形面积
    void calculateArea() override {
        area = 3.14 * radius * radius;
    }
};

// 派生类:矩形
class Rectangle : public Shape {
private:
    double length;
    double width;

public:
    // 构造函数,初始化长和宽
    Rectangle(double l, double w) : length(l), width(w) {}

    // 重写基类的纯虚函数,计算矩形面积
    void calculateArea() override {
        area = length * width;
    }
};

int main() {
    Circle circle(5);
    Rectangle rectangle(4, 6);

    circle.calculateArea();
    rectangle.calculateArea();

    std::cout << "圆形面积: " << circle.getArea() << std::endl;
    std::cout << "矩形面积: " << rectangle.getArea() << std::endl;

    return 0;
}

代码解释
在这个示例里,Circle和Rectangle类都继承自Shape类。Circle和Rectangle类继承了Shape类的area属性和getArea方法,并且分别重写了calculateArea方法来实现各自的面积计算逻辑。

 

三、多态


多态意味着不同对象对同一消息能做出不同响应。在 C++ 中,多态主要通过虚函数和继承来实现,这可以提高代码的灵活性和可扩展性,使程序能根据实际对象类型调用相应方法。

#include <iostream>

// 基类
class Animal {
public:
    // 虚函数,用于动物发出声音
    virtual void speak() {
        std::cout << "动物发出声音" << std::endl;
    }
};

// 派生类:猫
class Cat : public Animal {
public:
    // 重写基类的虚函数,实现猫的叫声
    void speak() override {
        std::cout << "猫喵喵叫" << std::endl;
    }
};

// 派生类:狗
class Dog : public Animal {
public:
    // 重写基类的虚函数,实现狗的叫声
    void speak() override {
        std::cout << "狗汪汪叫" << std::endl;
    }
};

// 函数接受基类引用,根据实际对象类型调用相应的speak方法
void makeAnimalSpeak(Animal& animal) {
    animal.speak();
}

int main() {
    Cat cat;
    Dog dog;

    makeAnimalSpeak(cat);
    makeAnimalSpeak(dog);

    return 0;
}

 代码解释
在这段代码中,Animal类有一个虚函数speak,Cat和Dog类分别重写了这个函数。makeAnimalSpeak函数接收一个Animal类的引用,根据传入的实际对象类型调用相应的speak方法,这就体现了多态性。

;