1. 程式人生 > >C++虛擬函式應用

C++虛擬函式應用

虛擬函式的作用是,允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標獲引用來訪問基類和派生類中的同名函式。
1.若在基類中,只宣告虛擬函式原型(有virtual),而在類外定義虛擬函式時,不用加virtual
2.在派生類中,虛擬函式被重新定義時,其函式原型與基類中的函式原型(包括函式型別,函式名,引數個數,引數順序)都必須完全相同,過載時同樣,若有一個不同,系統會把它作為普通函式過載過載,虛擬函式特性將丟失
3.虛擬函式必須是其所在類的成員函式,而不能是友元函式,不能是靜態成員函式
4.只能通過基類指標訪問虛擬函式才能獲得執行時的多型性

#include<iostream>
using namespace std; class b0 { public: virtual void print(char *p) { cout<<p<<"print()"<<endl; } } ; class b1:public b0 { public: virtual void print(char *p) { cout<<p<<"print()"<<endl; } }; int
main() { b0 b0;//定義基類物件b0 b0.print("b0::");//呼叫基類b1的print b1 b1;//定義派生類物件b1 b1.print("b1::");//呼叫派生類b1的print return 0; } //結果: b0::print() //b1::print()

在下面程式碼中,base1中的find函式是虛擬函式,當宣告為指向base1的指標指向派生類的物件時,find函式呈現出虛特性,呼叫deprived::find()函式。相反,base2中的find函式是個普通的函式。

#include<iostream>
using namespace std; class base1 { public: virtual void find() { cout<<"base1"<<endl; } }; class base2 { public: void find() { cout<<"base2"<<endl; } }; class deprived:public base1,public base2 { public: void find() { cout<<"deprived"<<endl; } }; int main() { base1 *p1; base2 *p2; deprived a; p1=&a; p2=&a; p1->find(); p2->find(); return 0; }

結果是,deprived,base2

虛擬函式舉例,計算三角形,矩形,圓的面積

#include<iostream>
using namespace std;
class figure
{
    public:
        figure(double a,double b)
        {
            x=a;
            y=b;
        }
        virtual void area()
        {
            cout<<"在基類中定義的虛擬函式,為派生類提供一個公共介面,以便派生類根據需要重新定義虛擬函式"<<endl;
        }

        protected:
            double x,y;
};

class triangle:public figure
{
    public:
        triangle(double a,double b):figure(a,b)
        {

        }
        void area()
        {
            cout<<"三角形的高是:"<<x<<",底是"<<y<<"面積是:"<<0.5*x*y<<endl;
        }
};

class square:public figure
{
    public:
        square(double a,double b):figure(a,b)
        {

        }
        void area()
        {
            cout<<"矩陣的長是"<<x<<"寬是"<<y<<"面積是"<<x*y<<endl; 
        }
};

class circle:public figure
{
    public:
        circle(double a):figure(a,a)
        {

        }
        void area()
        {
            cout<<"圓的半徑是"<<x<<"面積是"<<3.14*x*x<<endl; 
        }
};

int main()
{
    figure *p;
    triangle t(10.0,6.0);
    square s(10.0,6.0);
    circle c(10.0);
    p=&t;
    p->area();
    p=&s;
    p->area();
    p=&c;
    p->area();
    return 0;
}

純虛擬函式與抽象類
1.由於抽象類中至少含有一個沒有定義功能的純虛擬函式,因此抽象類只能作為其他類的基類,不能建立抽象類物件
2.如果在抽象類的派生類中沒有說明純虛擬函式,則該函式在派生類中仍為純虛擬函式,這個派生類仍是一個抽象類

#include<iostream>
using namespace std;
class shape
{
    public:
        shape(double x)
        {
            r=x;
        }
        virtual void area()=0;//定義純虛擬函式
        virtual void perimeter()=0;
        protected:
            double r;
 } ;

 class circle:public shape
 {
    public:
        circle(double x):shape(x)
        {

         }
         void area()
         {
            cout<<"這個圓的面積是:"<<3.14*r*r<<endl;
         }
         void perimeter()
         {
            cout<<"這個圓的周長時:"<<2*3.14*r; 
         }
 };

 class In_square:public shape{
    public:
        In_square(double x):shape(x)
        {

         }
         void area()
         {
            cout<<"正方形面積"<<2*r*r<<endl;
         }
         void perimeter()
         {
            cout<<"正方形周長:"<<4*3.14*r<<endl;
         }
 };
 class Ex_square:public shape{
    public:
    Ex_square(double x):shape(x)
    {
     }
     void area()
     {
        cout<<"圓外切正方形面積:"<<4*r*r<<endl;
     }
     void perimeter()
     {
        cout<<"圓外切正方形周長:"<<8*r<<endl;
     }
 };

 int main()
 {
    shape *ptr;
    circle ob1(5);
    In_square ob2(5);
    Ex_square ob3(5.6);
    ob1.area();
    ob1.perimeter();
    ptr=&ob1;
    ptr->area();
    ptr->perimeter();
    return 0;
      }