小工具知识网

当前位置: 首页 > 行业知识 > 【C++】---多态

行业知识

【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怎么文字跟着图片?

下一篇:辰域智控充值攻略,轻松上手,一键充值!