【C++期末开卷资料】3.虚函数和多态性

3.虚函数和多态性

3.1 多态性的概念

指的是不同的对象对于同样的消息会产生不同的行为。而消息在C++语言中指的就是函数的调用,不同的函数可以具有多种不同的功能,而多态就是允许用一个函数名来调用来实现不同的功能。

按照实现的时机,多态可以分为两类:

  1. 编译时多态 函数重载、运算符重载、模板
  2. 运行时多态 继承和虚函数

3.2 虚函数

3.2.1 虚函数的定义格式

class 类名
{
	......
	virtual 类型 成员函数名(参数表);
	......
}

虚函数必须存在于类的继承环境中才有意义!

使用运行时多态的条件:

  1. 有虚函数
  2. 符合赋值兼容规则
  3. 由指针或引用去调用虚函数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstring>
using namespace std;
class Shape {
    int x, y;
public:
    Shape(int xx = 0, int yy = 0) {
        x = xx;
        y = yy;
    }
    virtual void show() { cout << "图形的中心点是:" << "(" << x << "." << y << ")" << endl; }
    virtual void Area() { cout << "不知道是什么图形,不知道面积" << endl; }
};
class Circle :public Shape {
    int radius;
public:
    Circle(int x, int y, int r) :Shape(x, y), radius(r) {}
    virtual void show() {
        cout << "该图形是圆" << endl;
        Shape::show();
    }
    virtual void Area() {
        cout << "圆的面积是:" << 3.14 * radius * radius << endl;
    }
};
int main() 
{
    Shape s1(2, 2);
    Circle s2(2, 2, 1);
    s1.show();
    s1.Area();
    s2.show();
    s2.Area();
    return 0;
}

3.2.2 虚析构函数

(1)构造函数 不能被声明为虚函数

(2)析构函数

如果将基类的析构函数声明为虚函数时,则由该基类所派生的所有派生类的析构函数也自动称为虚函数。

专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态分配空间时能得到正确的处理。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstring>
using namespace std;
class Base {//定义基类
    int* pBase; 
public:
    Base() {//Base类构造函数
        pBase = new int;//开辟一个整型空间
        cout << "Construct Base." << endl;
    }
    virtual ~Base() {//Base类析构函数
        delete pBase;//释放整型空间
        cout << "Desconstuct Base." << endl;
    }
};
class Derivied :public Base//定义共有派生类Derived
{
    char* pDerivied;
public:
    Derivied() {
        pDerivied = new char;//开辟一个字符空间
        cout << "Construct Derived." << endl;
    }
    virtual ~Derivied() {
        delete pDerivied;//释放字符空间
        cout << "Deconstruct Derived." << endl;
    }
};
int main()
{
    Base* pb;//定义基类指针
    pb = new Derivied;//基类指针指向新生成的派生类堆对象
    delete pb;//释放对象 虚析构函数才能使两个空间均被释放
    return 0;
}

3.3 纯虚函数和抽象类

  1. 纯虚函数声明一般形式为:

virtual 函数类型 函数名 (参数表) =0;

eg.设计一个图形类Shape,定义求面积虚函数Area(),然后设计圆类和矩形类两个派生类,分别重写基类中的虚函数。

class Shape {//基类
public:
    virtual void Area() = 0;//纯虚函数   //有纯虚函数的类,被称为抽象类
    //{
      //  cout << "不知道是什么图形,不知道面积" << endl; 
    //}
};
class Circle :public Shape {
    int radius;
public:
    Circle(int r) : radius(r) {}
    void Area() {//重写父类的area函数
        cout << "圆的面积是:" << 3.14 * radius * radius << endl;
    }
};
class Rectangle :public Shape {
    int width, height;
public:
    Rectangle(int w, int h) :width(w), height(h) {}
   void Area() {//重写父类的area函数
        cout << "矩形的面积是:" << width * height << endl;
    }
};
void getArea(Shape* p)//计算任意图形面积的函数
{
    p->Area();
}
int main()
{
    //Shape s; //抽象类不能实例化对象
    Circle c(1);//创建Circle的对象c
    Rectangle r(4, 5);//创建Rectangle的对象r
    getArea(&c);//3.14
    getArea(&r);//20
    return 0;
}
  1. 抽象类

    (1)包含有纯虚函数的类抽象类

    (2)抽象类不能实例化

    (3)抽象化派生出新的类之后,如果派生类给出所有纯虚函数的函数实现,这个派生类就可以定义自己的对象,因而不再是抽象类;

//3.14
getArea(&r);//20
return 0;
}


2. 抽象类

   (1)包含有**纯虚函数的类**是**抽象类**。

   (2)**抽象类不能实例化**。

   (3)抽象化派生出新的类之后,如果派生类给出所有纯虚函数的函数实现,这个派生类就可以定义自己的对象,因而不再是抽象类;

   反之,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍然是一个抽象类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值