C++ Primer 第15章:面向对象编程深度解析

C++ Primer 第15章:面向对象编程深度解析

CppPrimer :books: Solutions for C++ Primer 5th exercises. CppPrimer 项目地址: https://gitcode.com/gh_mirrors/cp/CppPrimer

面向对象编程(OOP)是现代编程语言的核心范式之一,C++作为一门多范式语言,提供了强大的面向对象支持。本文将深入解析C++ Primer第15章关于面向对象编程的核心概念和技术要点。

虚函数与动态绑定

虚函数是C++实现多态性的关键机制。通过在基类中将成员函数声明为virtual,我们允许派生类重写该函数,实现运行时多态。

class Base {
public:
    virtual void print() const { /* 基类实现 */ }
    virtual ~Base() = default;  // 虚析构函数
};

关键点

  • 虚函数通过虚函数表(vtable)实现动态绑定
  • 基类通常应定义虚析构函数,即使它不执行任何操作
  • 纯虚函数(=0)使类成为抽象基类

访问控制与继承

C++提供三种访问说明符:publicprotectedprivate,它们在继承中有不同的表现:

class Base {
private:    // 仅基类和友元可访问
protected:  // 基类、友元和派生类可访问
public:     // 所有代码可访问
};

继承方式同样影响访问权限:

  • public继承:基类的publicprotected成员保持原访问级别
  • protected继承:基类的publicprotected成员变为protected
  • private继承:基类的所有成员变为private

类型系统:静态类型与动态类型

理解静态类型和动态类型的区别对掌握C++多态至关重要:

  • 静态类型:变量声明时的类型或表达式的结果类型,编译时确定
  • 动态类型:对象在运行时的实际类型,可能不同于静态类型
Base* p = new Derived();  // 静态类型是Base*,动态类型是Derived*

继承中的构造函数与析构函数

派生类对象的构造和销毁遵循特定顺序:

  1. 构造顺序

    • 基类部分
    • 派生类成员
    • 派生类构造函数体
  2. 析构顺序

    • 派生类析构函数体
    • 派生类成员
    • 基类部分

重要规则

  • 如果基类没有默认构造函数,派生类必须显式调用基类构造函数
  • 基类析构函数应该声明为虚函数,确保正确析构派生类对象

纯虚函数与抽象基类

纯虚函数通过在声明后添加=0来定义:

class Shape {
public:
    virtual double area() const = 0;  // 纯虚函数
};

抽象基类特点:

  • 不能创建抽象基类的实例
  • 派生类必须实现所有纯虚函数才能成为具体类
  • 常用于定义接口规范

对象切片问题

当派生类对象赋值给基类对象时,会发生对象切片:

Derived d;
Base b = d;  // 只复制Base部分,Derived特有部分被"切片"掉

解决方案

  • 使用指针或引用
  • 优先使用智能指针(std::shared_ptr)

继承与容器

在容器中存储多态对象时需特别注意:

std::vector<std::shared_ptr<Base>> vec;
vec.push_back(std::make_shared<Derived>());  // 正确方式

错误示例

std::vector<Base> vec;
vec.push_back(Derived());  // 对象切片,丢失派生类信息

重写(override)与final

C++11引入overridefinal关键字增强安全性:

class Derived : public Base {
public:
    void func() override;  // 显式标记为重写
    void final_func() final;  // 禁止进一步重写
};

优点

  • override确保函数确实重写了基类虚函数
  • final阻止派生类进一步重写该函数

设计继承体系的实践建议

  1. 基类析构函数应该为虚函数
  2. 考虑将不希望被重写的函数声明为final
  3. 使用protected而非private允许派生类访问必要成员
  4. 优先使用组合而非私有继承
  5. 接口类应该使用纯虚函数

通过深入理解这些概念,开发者可以构建出灵活、可维护的面向对象系统。C++的OOP机制虽然复杂,但提供了强大的表达能力,是构建大型软件系统的重要工具。

CppPrimer :books: Solutions for C++ Primer 5th exercises. CppPrimer 项目地址: https://gitcode.com/gh_mirrors/cp/CppPrimer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盛欣凯Ernestine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值