行业知识
【C++】---多态
2026-11-02 03:36:57
来源:互联网转载
【C++】---多态
- 一、多态的概念
- 二、多态的定义及实现
- 1、构成多态的2个必要条件
- 2、什么叫做虚函数的重写?
- 3、虚函数重写的3个例外
- 4、建议把 析构函数 都定义为:虚函数
- 三、C++11的两个关键字:final override
- 1、final:修饰虚函数,表示该虚函数不能再被重写
- 2、override: 检查是否重写
- 四、重载、隐藏、重写 的比较
- 五、多态的原理
- 1、虚表(虚函数表)
- 2、虚表指针:
- 3、底层原理:满足多态后,在调用的指令中,指向谁 就去谁的虚表 里面 找对应的 虚函数 进行调用!
- 六、抽象类
- 1、纯虚函数
- 2、抽象类(接口类)
- 3、接口继承和实现继承
- 七、单继承关系中的虚函数表
- 1、单继承中的虚函数表
- 八、继承和多态常见的面试问题
- 1、选择题
- 2、问答题
一、多态的概念
多态就是:多种形态。通俗的来说,多态的概念就是:同一件事情,不同的对象去做会有不同的结果。
二、多态的定义及实现
1、构成多态的2个必要条件
1. 子类必须对父类的虚函数进行重写(重写,包括三同:返回值相同,函数名相同,参数列表相同。协变除外)
2. 必须是父类的指针或者引用去调用虚函数,而且被调用的函数必须是虚函数。
2、什么叫做虚函数的重写?
1、什么叫做虚函数?
虚函数:在 成员函数 前面加 virtual
2、虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。
#includeusing namespace std;class Person{public:virtual void Buy_ticket(){cout public:virtual void Buy_ticket(){cout p.Buy_ticket();}int main(){Person p1;Student s1;Func(p1);Func(s1);return 0;}};class B : public A {};class Person {public: virtual A* f() {return new A;}};class Student : public Person {public: virtual B* f() {return new B;}};public: virtual ~Person() {cout public: virtual ~Student() { cout Person* p1 = new Person; Person* p2 = new Student; delete p1; delete p2; return 0;}public: virtual void Drive() final {}};class Benz :public Car{public: virtual void Drive() {cout public: virtual void Drive(){}};class Benz :public Car {public: virtual void Drive() override {cout public: virtual void Func1() { cout public: virtual void Func1() { cout cout cout public: virtual void Func1() {cout Base b; Derive d; return 0;}public: virtual void Drive() = 0;};class Benz :public Car{public: virtual void Drive() { cout public: virtual void Drive() { cout Car* pBenz = new Benz; pBenz-Drive(); Car* pBMW = new BMW; pBMW-Drive();}Animal a; return 0;} public : virtual void func1() { coutcout public : virtual void func1() {coutcoutcoutpublic:virtual void Color()//颜色{cout cout }; int main(){Animal a;Coral c;return 0;}public:virtual void Color()//颜色{cout cout Animal a;Animal a1; return 0;}public: A(char *s) { cout}};class B:virtual public A{public: B(char *s1,char*s2):A(s1) { coutpublic: C(char *s1,char*s2):A(s1) { coutpublic: D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1) { cout D *p=new D("class A","class B","class C","class D"); delete p; return 0;} public: int _b1; };class Base2 { public: int _b2; };class Derive : public Base1, public Base2 { public: int _d; };int main(){ Derive d; Base1* p1 = &d; Base2* p2 = &d; Derive* p3 = &d; return 0;} public: virtual void func(int val = 1){ std::cout func();} }; class B : public A { public: void func(int val=0){ std::cout B*p = new B; p-test(); return 0; }
上一篇:html怎么文字跟着图片?