封装、继承、多态需协同:bankaccount私有balance+公有接口实现封装;checkingaccount公有继承复用并扩展;虚析构+纯虚函数+智能指针实现安全多态。

直接用一个能编译、能跑、能改的小程序,把封装、继承、多态一次性串起来,比背定义管用得多。
封装:用 BankAccount 隐藏余额和校验逻辑
封装不是“把所有东西塞进 class”,而是有意识地划分「谁该看到什么」。比如账户余额不能被外部随意修改,但可以存取——这就需要 private 成员 + public 接口。
-
balance必须是private:防止acc.balance = -1000;这种破坏性赋值 -
deposit()和get_balance()是public:提供可控的访问入口,内部还能加校验(比如拒绝负数存款) - 别把构造函数写成
BankAccount(double b) : balance(b) {}——这等于开门放人进来绕过校验
继承:用 CheckingAccount 扩展 BankAccount 而不改原类
继承不是为了“多写一个类”,而是当新类型天然属于老类型的子集时(比如支票账户「是一种」银行账户),复用已有逻辑并只专注差异点。
- 必须用
public继承:class CheckingAccount : public BankAccount;class默认是private继承,会导致基类public成员在派生类里变成不可见 - 子类不该重复实现
get_balance(),但可以加专属功能,比如withdraw_with_fee(double amount) - 别在子类里再声明一个
double balance;——这会造成二义性和内存浪费,基类的balance已经存在且受保护
多态:用 std::vector<:unique_ptr>></:unique_ptr> 统一管理不同账户
多态的关键不在“虚函数怎么写”,而在「你是否真的需要运行时切换行为」。如果只是两个类各自算各自的利息,却硬套 virtual,反而增加开销和理解成本。
- 基类必须有
virtual析构函数:virtual ~BankAccount() = default;,否则delete派生类指针会漏掉子类部分析构 - 想支持多态行为(比如统一计算年利息),就在基类加
virtual double annual_interest() const = 0;,子类分别实现 - 别用裸指针存多态对象:
BankAccount* p = new CheckingAccount(...);容易忘delete;优先用std::unique_ptr<bankaccount></bankaccount> - 调用时别写
p->annual_interest();然后自己判断类型——那是 if-else,不是多态;让虚函数机制自动分发就行
真正容易被忽略的点是:三大特性不是独立存在的。比如没封装好(balance 是 public),继承就可能被滥用(子类直接改余额);没写 virtual 析构,多态容器一释放就崩溃。它们是一环扣一环的约束关系,不是三个可选模块。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











