动态联编

来源:互联网 发布:lg照片打印机的软件 编辑:程序博客网 时间:2024/05/01 01:31
 
#include<iostream>using namespace std;class A{public:virtual void fun(){cout<<"A"<<endl;}};class B:public A{public:virtual void fun(){cout<<"B"<<endl;}};int main(){A *a;int i;while(cin>>i){switch(i){case 1:a=new A;a->fun();break;case 2:a=new B;a->fun();break;default:cout<<"error"<<endl;break;}}return 0;}


只有在使用指针或引用的时候才能实现动态联编。

在虚函数调用成员函数的例程如下:

#include<iostream>using namespace std;class A{public:virtual void fun(){cout<<"A"<<endl;two();}void two(){cout<<"B"<<endl;}};class B:public A{public:void fun(){cout<<"1"<<endl;two();}void two(){cout<<"2"<<endl;}};class C:public A{public:void fun(){cout<<"一"<<endl;two();}void two(){cout<<"二"<<endl;}};int main(){A *a;int i;while(cin>>i){switch(i){case 1:a=new A;a->fun();break;case 2:a=new B;a->fun();break;case 3:a=new C;a->fun();break;default:cout<<"error"<<endl;break;}}return 0;}


输出为:

 
 
虚析构函数:
#include<iostream>using namespace std;class A{public:A(){cout<<"A Con"<<endl;}virtual void fun(){cout<<"A"<<endl;two();}void two(){cout<<"B"<<endl;}virtual ~A(){cout<<"A Dis"<<endl;}};class B:public A{public:B(){cout<<"B Con"<<endl;}void fun(){cout<<"1"<<endl;two();}void two(){cout<<"2"<<endl;} ~B(){cout<<"B Dis"<<endl;}};class C:public A{public:C(){cout<<"C Con"<<endl;}void fun(){cout<<"一"<<endl;two();}void two(){cout<<"二"<<endl;} ~C(){cout<<"C Dis"<<endl;}};int main(){A *a;int i;while(cin>>i&&i){switch(i){case 1:a=new A;a->fun();break;case 2:a=new B;a->fun();break;case 3:a=new C;a->fun();break;default:cout<<"error"<<endl;break;}delete a;}return 0;}

在将基类指针指向派生类对象时,如果基类析构函数不声明为虚析构,则只能析构基类的对象,而不能析构派生类对象,在上面例程中如果将A的析构函数前的virtual去掉就会出现调用两个构造函数而只析构一个对象的现象。这样就会导致内存泄露。

 

原创粉丝点击