C++虛擬函式應用
阿新 • • 發佈:2019-02-13
虛擬函式的作用是,允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標獲引用來訪問基類和派生類中的同名函式。
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;
}