虚函数和抽家类
虚函数和抽象类
士主要内容 虚函数的使用 ■抽象类的概念和定义 n纯虚函数的使用
◼ 虚函数的使用 ◼ 抽象类的概念和定义 ◼ 纯虚函数的使用 主要内容
虚函数的使用 虚函数是动态联编的基础。 是非静态的成员函数。 在类的定义中,在函数原型之前写 virtual virtual只用来说明类定义中的原型,不能用在函数实 现时。 具有继承性,基类中定义了虚函数,派生类中无论是 否说明,同原型函数都自动为虚函数 本质:不是重载定义而是覆盖定义。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数
◼ 虚函数是动态联编的基础。 ◼ 是非静态的成员函数。 ◼ 在类的定义中,在函数原型之前写virtual。 ◼ virtual 只用来说明类定义中的原型,不能用在函数实 现时。 ◼ 具有继承性,基类中定义了虚函数,派生类中无论是 否说明,同原型函数都自动为虚函数。 ◼ 本质:不是重载定义而是覆盖定义。 ◼ 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数。 虚函数的使用
士写出运行结果 #include iostream. h> class bo∥类声明 public:∥外部接口 virtual void display)∥虚成员函数 scout<<B0: display"<<endl;
写出运行结果 #include class B0 //基类声明 { public: //外部接口 virtual void display() //虚成员函数 {cout<<"B0::display()"<<endl;} };
class b1: public bo∥公有派生 i public void display i cout<<Bl: display( "endl class dl: public bl∥公有派生 i public void display i cout<< DI: display"<<endl
class B1: public B0 //公有派生 { public: void display() { cout<<"B1::display()"<<endl; } }; class D1: public B1 //公有派生 { public: void display() { cout<<"D1::display()"<<endl; } };
void fun(BO*ptr)/普通函数 i ptr->display: j void maino∥主函数 B0Ob0,*p;∥声明基类对象和指针 Blbl;∥声明派生类对象 D1d1;/声明派生类对象 p=&bo fun(p),∥调用基类BO函数成员 p=&bl fun(p);∥调用派生类B1函数成员 p=&dI fun(p);∥调用派生类D1函数成员
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函数成员 }
程序的运行结果为: BO: display ■B1: display( D1: display o
◼ 程序的运行结果为: ◼ B0::display() ◼ B1::display() ◼ D1::display()
虚函数与构造函数 虚函数用于实现不同对象有不同的行为, 是实现运行时多态的基础,是针对对象 而言的 而构造函数是在对象尚未完全建立起来 的时候执行的。因此将构造函数声明为 虚函数是没有意义的
◼ 虚函数用于实现不同对象有不同的行为, 是实现运行时多态的基础,是针对对象 而言的。 ◼ 而构造函数是在对象尚未完全建立起来 的时候执行的。因此将构造函数声明为 虚函数是没有意义的。 虚函数与构造函数
虚函数与析构函数 ■例1示例虚函数与析构函数 ■析构函数可以是虚函数,也往往被定义 为虚函数。 般来说,若某类中有虚函数,则其析 构函数也应当定义为虚函数。 ■如果一个类的析构函数是虚函数,那么 由它派生的所有子类的析构函数都是虚 函数。保证对象的销毁工作彻底完成
◼例1 示例虚函数与析构函数 ◼析构函数可以是虚函数,也往往被定义 为虚函数。 ◼一般来说,若某类中有虚函数,则其析 构函数也应当定义为虚函数。 ◼如果一个类的析构函数是虚函数,那么 由它派生的所有子类的析构函数都是虚 函数。保证对象的销毁工作彻底完成。 虚函数与析构函数
纯虚函数与抽家类 Shape →抽象类 Int x,y drawL; //KlE 纯虚函数 area( //AE setvalued Square Circle drawL drawL a0: area areao
纯虚函数与抽象类 抽象类 纯虚函数 Square draw(); area(); Circle draw(); area(); Shape draw();//虚 area();//虚 setvalue(); int x,y;