二、選擇題(至少選一個,可以多選)
(1)用關鍵字( A )標記的函數被稱爲虛函數。
A. virtual B. private C. public D. protected
(2)在C++中,要實現動態聯編,必須使用( D )調用虛函數。
A. 類名 B. 派生類指針 C. 對象名 D. 基類指針
(3)下列函數中,可以作爲虛函數的是( BD )。
A. 普通函數 B. 非靜態成員函數 C. 構造函數 D. 析構函數
(4)在派生類中,重載一個虛函數時,要求函數名、參數的個數、參數的類型、參數的順序和函數的返回值( B )。
A. 不同 B. 相同 C. 相容 D. 部分相同
(5)使用虛函數保證了在通過一個基類類型的指針(含引用)調用一個虛函數時,C++系統對該調用進行( A ),但是,在通過一個對象訪問一個虛函數時,使用( B )。
A. 動態聯編 B. 靜態聯編 C. 動態編譯 D. 靜態編譯
(6)下面函數原型聲明中,( B )聲明的func()爲純虛函數。
A. void func()=0; B. virtual void func()=0;
C. vitual void func(); D. virtual void func(){};
(7)若一個類中含有純虛函數,則該類稱爲( C )。
A. 基類 B. 虛基類 C. 抽象類 D. 派生類
(9)下面描述中,( BD )是正確的。
A. 虛函數是沒有實現的函數 B. 純虛函數的實現是在派生類中定義
三、判斷題
(1)抽象類中只能有一個純虛數。 ( 錯 )
(2)構造函數和析構函數都不能說明爲虛基數。 ( 錯 )
(3)程序中可以說明抽象類的指針或引用。 ( 對 )
(4)一個類中的虛基數說明不僅對基類中的同名函數有影響,而且對它的派生類中的重定義的函數也有影響 ( 錯 )
(5)在構造函數和析構函數中調用虛函數時,採用動態聯編,即它們所調用的虛函數時是在派生類中重定義的虛函數 ( 錯 )
(6)因爲沒有爲純虛函數定義代碼,所以在構造函數和析構函數內均不可調用純虛函數。 ( 對 )
四、簡答題
(1)什麼叫做多態性?在C++中是如何實現多態的?
(2)虛函數與一般重載函數有哪些區別?
(1)使用虛函數編寫程序求球體和圓柱體的體積及表面積。由於球體和圓柱體都可以看作由圓繼承而來,所以可以定義圓類Circle作爲基類。在Circle類中定義一個數據成員radius和兩個虛函數area()和volume()。由Circle 類派生Sphere類和Column類。在派生類中對虛函數area()和volume()重新定義,分別求球體和圓柱體的體積及表面積。
#include <iostream>
#include <iomanip>
using std::fixed;
using std::setprecision;
using namespace std;
const double PI=3.14159265;
class Circle
{ public:
Circle(double r) {radius=r;}
virtual double area() {return 0.0;}
virtual double volume() {return 0.0;}
protected:
double radius;
};
class Sphere:public Circle
{ public:
Sphere(double r):Circle(r){ }
double area() {return 4.0*PI*radius*radius;}
double volume()
{ return 4.0/3.0*PI*radius*radius*radius;}
};
class Column:public Circle
{ public:
Column(double r,double h):Circle(r){height=h;}
double area()
{ return 2.0*PI*radius*(height+radius );}
double volume()
{ return PI*radius*radius*height;}
private:
double height;
};
int main()
{
Sphere s(3.0);
Column c(4.0,5.0);
cout <<fixed<<setprecision(2)<< "球的體積 = " << s.volume() << endl;
cout << fixed<<setprecision(2)<<"球的表面積 = " << s.area() << endl;
cout << fixed<<setprecision(2)<<"圓柱體的體積 = " << c.volume() << endl;
cout <<fixed<<setprecision(2)<< "圓柱體的表面積 = " << c.area() << endl;
return 0;
}
#include<iostream>
#include<iomanip>
using std::fixed;
using std::setprecision;
const double PI=3.1415;
using namespace std;
class square
{
public:
square(float l){length=l;}
virtual float area(){return length*length;}
private:
float length;
};
class triangle
{
public:
triangle(float b,float h){base=b;height=h;}
virtual float area(){return base*height/2.0;}
private:
float base,height;
};
class Circle
{
public:
Circle(double r){radius=r;}
virtual double area(){return PI*radius*radius;}
private:
double radius;
};
int main()
{
square s(6.0);
triangle t(3.0,4.0);
Circle c(5.0);
cout<<fixed<<setprecision(2)<<"正方形的面積="<<s.area()<<endl;
cout<<fixed<<setprecision(2)<<"三角形的面積="<<t.area()<<endl;
cout<<fixed<<setprecision(2)<<"圓的表面積="<<c.area()<<endl;
cout<<fixed<<setprecision(2)<<"各類形狀的總面積="<<s.area()+c.area()+t.area()<<endl;
return 0;
}
程序輸出結果如下: