一、封装
封装是将数据和操作数据的函数捆绑在一起形成类,通过访问控制限定符(如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方法,这就体现了多态性。