继承、多态与虚函数
2026/7/21 6:51:04 网站建设 项目流程

继承、多态与虚函数

代码复用与运行时绑定

继承让派生类获得基类的成员;多态让同一接口在不同对象上表现出不同行为。C++ 通过virtual虚函数实现运行时多态。


一、继承基础

1.1 语法

#include<iostream>#include<string>classPerson{protected:std::string name;intage;public:Person(conststd::string&n,inta):name(n),age(a){}voidshowInfo()const{std::cout<<name<<", "<<age<<" 岁"<<std::endl;}};classStudent:publicPerson{private:std::string studentId;public:Student(conststd::string&n,inta,conststd::string&id):Person(n,a),studentId(id){}voidshowInfo()const{Person::showInfo();std::cout<<"学号:"<<studentId<<std::endl;}};intmain(){Students("李四",20,"2024001");s.showInfo();return0;}

1.2 继承方式

方式含义
public继承最常用,is-a 关系
protected继承较少用
private继承实现继承,较少用

二、访问控制与继承

基类成员public 继承protected 继承private 继承
publicpublicprotectedprivate
protectedprotectedprotectedprivate
private不可访问不可访问不可访问

派生类可访问基类的publicprotected成员。


三、虚函数与多态

3.1 问题:非虚函数

classAnimal{public:voidspeak(){std::cout<<"..."<<std::endl;}};classDog:publicAnimal{public:voidspeak(){std::cout<<"汪汪!"<<std::endl;}};Animal*p=newDog();p->speak();// 输出 "..." — 非多态!deletep;

3.2 虚函数解决

classAnimal{public:virtualvoidspeak(){std::cout<<"..."<<std::endl;}virtual~Animal(){}// 虚析构,多态删除时必须};classDog:publicAnimal{public:voidspeak()override{std::cout<<"汪汪!"<<std::endl;}};Animal*p=newDog();p->speak();// 输出 "汪汪!" — 多态!deletep;

virtual:通过基类指针/引用调用时,根据实际对象类型决定调用哪个版本。

3.3 override 与 final(C++11)

voidspeak()override;// 显式标记重写voidspeak()final;// 禁止进一步重写

四、纯虚函数与抽象类

含纯虚函数的类为抽象类,不能实例化:

classShape{public:virtualdoublearea()const=0;// 纯虚函数virtual~Shape()=default;};classCircle:publicShape{doubleradius;public:Circle(doubler):radius(r){}doublearea()constoverride{return3.14159*radius*radius;}};

五、多态的应用

voidprintArea(constShape&s){std::cout<<"面积:"<<s.area()<<std::endl;}Circlec(5);Rectangler(3,4);printArea(c);// 圆面积printArea(r);// 矩形面积

同一函数printArea处理不同形状,体现多态


六、实战练习

练习1:继承层次

定义Vehicle基类,CarBicycle派生类,各自实现move()

练习2:虚函数多态

定义Employee基类(虚函数salary()),ManagerDeveloper派生类重写。

练习3:抽象类

定义抽象类Animal,派生CatDog,用基类指针数组调用speak()


七、总结与延伸

本节重点回顾

  1. 继承class Derived : public Base
  2. virtual实现运行时多态;基类指针调用派生类方法
  3. override标记重写;纯虚函数= 0定义抽象类
  4. 多态基类需虚析构函数

下节预告

下一篇:《模板与 STL 基础》。

延伸阅读

  • C++ 速查 §9 继承与多态

📌知识点卡片

  • 继承:class D : public B;
  • virtual void f(); override;
  • 纯虚:virtual void f() = 0;
  • 多态基类:virtual ~Base() {}

下一篇见!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询