首页 > 编程语言 >C++温故补缺(九):C++多态

C++温故补缺(九):C++多态

时间:2023-03-20 23:25:00浏览次数:37  
标签:函数 area int 多态 C++ height width Shape 温故

C++多态

继承和派生

当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态

如:shape类被派生为两个类:Rectangle和Triangle

#include<iostream>
using namespace std;

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        int area(){
            cout<<"parent class area";
            return 0;
        }
};

class Rectangle:public Shape{
    public:
        Rectangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height;
        }
};
class Triangle:public Shape{
    public:
        Triangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height/2;
        }
};
int main(){
    Rectangle rec(10,7);
    Triangle tri(10,5);
    cout<<tri.area()<<endl;
    cout<<rec.area()<<endl;
}

虚函数

虚函数是在基类中用关键字virtual声明的函数,在派生类中重新定义基类中定义过的虚函数时,会告诉编译器不要静态链接到该函数

如:上面的例子

int main(){
    Shape *shape;
    Rectangle rec(10,7);
    Triangle tri(10,5);
    shape=&rec;
    cout<<shape->area()<<endl;
    shape=&tri;
    cout<<shape->area()<<endl;
}

输出

并不是想象中的两个面积,这是因为调用shape->area()是基类中的area()函数,这就是静态多态静态链接,函数调用在程序执行前就准备好了,也被称为早绑定,要解决这个问题,可以使用virtual修饰基类中的area()函数。

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        virtual int area(){
            cout<<"parent class area";
            return 0;
        }
};

输出

这样程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接

纯虚函数

如果定义虚函数=0,如virtual int area()=0;

那么这个函数就是一个纯虚函数,纯虚函数所在的类,只能被继承,不能用于实例化,类似java中的抽象类

如:

#include<iostream>
using namespace std;

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        virtual int area()=0;
};

class Rectangle:public Shape{
    public:
        Rectangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height;
        }
};

int main(){
    Rectangle rec(10,2);
    cout<<rec.area();
}

标签:函数,area,int,多态,C++,height,width,Shape,温故
From: https://www.cnblogs.com/Tenerome/p/cppreview9.html

相关文章

  • C++温故补缺(八):运算符重载和函数重载
    运算符重载和函数重载重载是c++多态性的一大体现,重载运算符是给运算符添加新的定义,使之前不能运算的对象变得可运算,且一般和运算符的意义相似.函数重载主要是同名函数......
  • C++温故补缺(七):;类的访问控制和继承
    类的访问控制和继承类的静态成员类的静态成员用关键字static修饰,类似静态变量或静态函数,也是有共享的概念类的静态变量:静态变量在类的所有对象中共享,不能再类的定......
  • C++温故补缺(六):友元函数、内联函数和this指针
    友元函数、内联函数和this指针友元函数友元函数是定义在类的外部,但有权访问类的所有私有(private)和保护(protectd)成员.友元函数的原型在类的定义中出现,但它并不是类......
  • C++温故补缺(十五):多线程
    多线程参考:CSDN,知乎传统C++(C++11之前)中并没有引入线程的概念,如果想要在C++中实现多线程,需要借助操作系统平台提供的API,如Linux的<pthread.h>,或windows下的<windows.......
  • C++温故补缺(十四):信号处理
    信号处理信号是由操作系统传给进程的中断,能够提前终止一个程序。在Unix,Linux,MacOS或Windows系统上,都可以通过Ctrl+C产生中断。下面是可以在程序中被捕获的信号,并且可......
  • C++温故补缺(十三):模板
    C++模板模板是泛型的基础,泛型编程就是一种独立于任何特殊类型的方式编写代码。模板就是创建泛型类或泛型函数的蓝图。STL库中的几个数据结构(vector,list,map等)以及算法......
  • C++温故补缺(十二):动态内存
    C++动态内存同C,C++中也是有堆和栈的概念。栈是函数内部声明的所有变量都所占用空间,堆是程序中未使用的内存,在程序运行期间可用于动态分配。同样也有alloc()分配内存,新增......
  • C++温故补缺(十一):异常
    异常处理参考:cnblogs异常和错误(bug)异常:是程序开发过程中必须考虑的一些特殊情况,是程序运行时可以预料的执行分支。异常是不可以避免的,如0除问题,数组越界问题,文件不存在......
  • C++温故补缺(十):C++文件读写和流
    C++文件和流C++文件的读写流用的是fstream库,它定义了三个新的数据类型:数据类型描述ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstr......
  • 【多态】中的【instanceof】
    /***Bysleeon2023/3/20*父类引用指向子类对象,这个引用既属于子类,又属于父类*但是如果各自创建对象的话,父类对象就不属于子类*/publicclassTest{pub......