文档介绍:C 语言程序设计
*
2021/2/22
问题举例——复数的运算
class complex //复数类声明
{
public:
complex(double r=,double i=) //构造函数
定
程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。
静态绑定〔静态联编〕
联编工作出如今编译阶段,用对象名或者类名来限定要调用的函数。
动态绑定
联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。
*
2021/2/22
静态绑定与动态绑定
静态绑定实例
*
2021/2/22
静态绑定与动态绑定
动态绑定实例
动态绑定也称为运行时的多态
动态绑定指在程序运行时才确定将要调用的代码在哪里? 编译程序时无法确定.
一样的消息发送给不同的对象,将导致不同的行为
*
2021/2/22
虚函数(总结)
虚函数是动态绑定的根底。
是非静态的成员函数。
在类的声明中,在函数原型之前写virtual。
virtual 只用来说明类声明中的原型,不能用在函数实现时。
具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
本质:不是重载声明而是覆盖。
调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。
虚 函 数
*
2021/2/22
例 (自学,跳过)
#include <iostream>
using namespace std;
class B0 //基类B0声明
{public: //外部接口
virtual void display() //虚成员函数
{cout<<"B0::display()"<<endl;}
};
class B1: public B0 //公有派生
{ public:
void display() { cout<<"B1::display()"<<endl; }
};
class D1: public B1 //公有派生
{ public:
void display() { cout<<"D1::display()"<<endl; }
};
虚 函 数
*
2021/2/22
void fun(B0 *ptr) //普通函数
{ ptr->display(); }
void main() //主函数
{ B0 b0, *p; //声明基类对象和指针
B1 b1; //声明派生类对象
D1 d1; //声明派生类对象
p=&b0;
fun(p); //调用基类B0函数成员
p=&b1;
fun(p); //调用派生类B1函数成员
p=&d1;
fun(p); //调用派生类D1函数成员
}
运行结果:
B0::display()
B1::display()
D1::display()
*
*
2021/2/22
虚析构函数(难)
何时需要虚析构函数?
当你可能通过基类指针删除派生类对象时
假如你打算允许其别人通过基类指针调用对象的析构函数〔通过delete这样做是正常的〕,并且被析构的对象是有重要的析构函数的派生类的对象,就需要让基类的析构函数成为虚拟的。
虚 函 数
*
2021/2/22
虚析构函数(难)
虚析构函数的使用
虚 函 数
*
2021/2/22
抽象类
带有纯虚函数的类称为抽象类:
class 类名
{
virtual 类型 函数名(参数表)=0;
//纯虚函数
...
}
纯虚函数与抽象类
*
2021/2/22
抽象类
纯虚函数与抽象类
作用
抽象类为抽象和设计的目的而声明,将有关的数据和行为组织在一个继承层次构造中,保证派生类具有要求的行为。
对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。
注意
抽象类只能作为基类来使用。
不能声明抽象类的对象。
构造函数不能是虚函数,析构函数可以是虚函数。
*
2021/2/22
例 举例
纯虚函数与抽象类
#include <iostream>
using namespace std;
class B0 //抽象基类B0声明
{ public: //外部接口
virtual void display( )=0; //纯虚函数成员
};
class B1: public B0 //公有派生
{ public:
void display(){cou