C++ 继承与多态

一、继承 (Inheritance)

1. 基本概念

继承是面向对象编程的重要特性,允许一个类(派生类/子类)基于另一个类(基类/父类)来构建,继承其属性和方法。

2. 继承方式

class Base {
    // 基类成员
};

// 公有继承
class DerivedPublic : public Base { /*...*/ };

// 保护继承
class DerivedProtected : protected Base { /*...*/ };

// 私有继承
class DerivedPrivate : private Base { /*...*/ };

3. 继承中的访问控制

public

public

public

protected

public

protected

private

public

不可访问

public

protected

protected

protected

protected

protected

private

protected

不可访问

public

private

private

protected

private

private

private

private

不可访问

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

  • 构造顺序:基类 → 成员对象 → 派生类
  • 析构顺序:派生类 → 成员对象 → 基类

二、多态 (Polymorphism)

1. 基本概念

多态是指通过基类的指针或引用调用派生类的重写函数的能力。

2. 虚函数 (Virtual Function)

class Base {
public:
    virtual void show() { cout << "Base show" << endl; }
    virtual ~Base() {} // 虚析构函数
};

class Derived : public Base {
public:
    void show() override { cout << "Derived show" << endl; }
};

3. 纯虚函数与抽象类

class AbstractBase {
public:
    virtual void pureVirtual() = 0; // 纯虚函数
};

class Concrete : public AbstractBase {
public:
    void pureVirtual() override { /* 实现 */ }
};

4. 多态的实现原理

  • 虚函数表 (vtable):每个有虚函数的类都有一个虚函数表
  • 虚指针 (vptr):每个对象包含一个指向虚函数表的指针

5. override 和 final 关键字

  • override:显式指明重写基类虚函数
  • final:禁止派生类重写虚函数或禁止类被继承

三、继承与多态的应用示例

#include <iostream>
using namespace std;

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

class Circle : public Shape {
    double radius;
public:
    Circle(double r) : radius(r) {}
    double area() const override {
        return 3.14159 * radius * radius;
    }
};

class Rectangle : public Shape {
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    double area() const override {
        return width * height;
    }
};

void printArea(const Shape& shape) {
    cout << "Area: " << shape.area() << endl;
}

int main() {
    Circle c(5.0);
    Rectangle r(4.0, 6.0);
    
    printArea(c);  // 输出圆的面积
    printArea(r);  // 输出矩形的面积
    
    Shape* shapes[] = {&c, &r};
    for (auto s : shapes) {
        cout << "Area: " << s->area() << endl;
    }
    
    return 0;
}

四、注意事项

  1. 基类析构函数应该声明为虚函数,防止通过基类指针删除派生类对象时内存泄漏
  2. 不要滥用继承,遵循"is-a"关系
  3. 多态会增加一定的运行时开销(虚函数表查找)
  4. 构造函数和析构函数中不要调用虚函数,此时多态机制不会正常工作
  5. 使用智能指针管理多态对象可以避免内存泄漏问题
全部评论
点赞 回复 分享
发布于 04-24 23:09 广东

相关推荐

04-29 14:41
已编辑
深圳大学 Java
这段时间忙着毕设一点准备没有,本身学的也是java(技术水),发现投的java全部石沉大海,反倒是投的cocos相关和游戏开发的回复率较高,做了两场笔,进了2次面(有一家没笔试)3.30&nbsp;网申先插播一条逸闻,去boss上搜到这家的游测助理岗,hr秒批说让进官网网申,然后进去一看有游戏开发岗,果断转投这个,次日boss上hr回我为什么没投,我说我投客户端开发了(笑)3.31次日通过,当天完成各位都完成过的各类评测4.3上午收到观点题通知,要求24小时完成,但我那天要忙着回家,到家已是半夜2点。在网吧没开视频满脸困意与疑惑下写完了小作文。4.8假期后返校某天突然收到笔试通知,4.9指定时间内完成,具体内容不太记得,大致范围包含基本八股,数据结构各种树和图,数据库相关,经典死锁等。但我感觉是很难的,最后给一道游戏有关暴击率期望计算题(思想正确,结果错误❌)4.14又是突然之间,收到技术面通知安排在4.18下午此时才注意起来这家已经进到正式流程问了两个c++八股,接着跳转到项目,进行针对性深挖,后续几乎一直在看项目(大约3个项目,有一个没写在简历上),聊了1h15min左右。期间穿插一些c++的问题,智能指针,指针函数之类的。手搓单例模式。4.21通知4.24上午hr面试。hr面很平淡,先问常规问题,聊了吸烟问题,实习问题,家庭情况等,不过家庭情况聊的比较细致。接着问期望薪资,加班接受情况。然后问了两个观点题(应该是当时没答好的两个,当时答的时候我自认答得三观很正,但后来才了解到这家并非要三观正(笑))个人感觉答的良好。结束说五个工作日内给消息。结束之后两小时显示审核中。4.29审核的第5个工作日,下午2点显示未录用。没有原因。全程也没有对接人。估计是要多了。结论:过完五一接着找吧(昨天才拒了另一家搞机器学习的,这下自己搞到0offer了)
点赞 评论 收藏
分享
评论
4
2
分享

创作者周榜

更多
牛客网
牛客企业服务