我們研究一下繼承和虛函數。
比如我們需要求正方形、長方形的周長、面積:
選擇1計算長方形
選擇2計算正方形
選擇3退出
其他無效
我們做一個繼承實現,父類矩形,子類有正方形、長方形繼承矩形
C++的繼承語法如下:
矩形
class Rectangle
正方形
class Square: public Rectangle
長方形
class Oblong: public Rectangle
對正方形、長方形求面積、周長。面積公式相同,在矩形父類完成,函數area();周長公式不同,在各個子類種實現。這裡有一個虛函數side()。
/**
* 求邊長
*/
virtual int side()=0;
讓函數side()=0;是在此定義,由子類實現。類似於Java的抽象父類,指定需要子類實現的方法。
矩形類:
/**
* 矩形
*/
class Rectangle {
protected:
int a; // a邊
int b; // b邊
public:
/**
* 求面積
*/
int area() {
return a * b;
}
/**
* 求邊長
*/
virtual int side()=0;
};
設置了a、b兩邊且為protected供子類直接使用,給出了求面積的函數實現area(),同時定義了求邊長的函數side(),要求函數side()由子類實現。
正方形類:
/**
* 正方形
*/
class Square: public Rectangle {
public:
/**
* 設置邊
*/
void setA(int a) {
this->a = a;
this->b = a;
}
/**
* 求邊長
*/
virtual int side() {
return 4 * a;
}
};
實現了求邊長函數side(),同時加入設置邊函數setA(int a)。
長方形類:
/**
* 長方形
*/
class Oblong: public Rectangle {
public:
/**
* 設置a邊
*/
void setA(int a) {
this->a = a;
}
/**
* 設置b邊
*/
void setB(int b) {
this->b = b;
}
/**
* 求邊長
*/
virtual int side() {
return 2 * a * b;
}
};
實現了求邊長函數side(),同時加入設置邊函數setA(int a)和setB(int b)。根據輸入做相應計算:
/**
* 計算
*/
inline void calculate() {
int chioce; // 選項
int a; // a邊
int b; // b邊
Oblong o; // 長方形
Square s; // 正方形
cout << endl;
cout << "選擇矩形類型:" << endl;
cout << "1-長方形" << endl;
cout << "2-正方形" << endl;
cout << "3-退出" << endl;
cin >> chioce;
switch (chioce) {
case 1:
cout << "輸入a邊:";
cin >> a;
cout << "輸入b邊:";
cin >> b;
o.setA(a);
o.setB(b);
cout << "面積為:" << o.area() << endl;
cout << "周長為:" << o.side() << endl;
calculate();
break;
case 2:
cout << "輸入a邊:";
cin >> a;
s.setA(a);
cout << "面積為:" << s.area() << endl;
cout << "周長為:" << s.side() << endl;
calculate();
break;
case 3:
break;
default:
cout << "無效輸入" << endl;
calculate();
break;
}
}
給出整體代碼:
#include <iostream>
using namespace std;
/**
* 矩形
*/
class Rectangle {
protected:
int a; // a邊
int b; // b邊
public:
/**
* 求面積
*/
int area() {
return a * b;
}
/**
* 求邊長
*/
virtual int side()=0;
};
/**
* 正方形
*/
class Square: public Rectangle {
public:
/**
* 設置邊
*/
void setA(int a) {
this->a = a;
this->b = a;
}
/**
* 求邊長
*/
virtual int side() {
return 4 * a;
}
};
/**
* 長方形
*/
class Oblong: public Rectangle {
public:
/**
* 設置a邊
*/
void setA(int a) {
this->a = a;
}
/**
* 設置b邊
*/
void setB(int b) {
this->b = b;
}
/**
* 求邊長
*/
virtual int side() {
return 2 * a * b;
}
};
/**
* 計算
*/
inline void calculate() {
int chioce; // 選項
int a; // a邊
int b; // b邊
Oblong o; // 長方形
Square s; // 正方形
cout << endl;
cout << "選擇矩形類型:" << endl;
cout << "1-長方形" << endl;
cout << "2-正方形" << endl;
cout << "3-退出" << endl;
cin >> chioce;
switch (chioce) {
case 1:
cout << "輸入a邊:";
cin >> a;
cout << "輸入b邊:";
cin >> b;
o.setA(a);
o.setB(b);
cout << "面積為:" << o.area() << endl;
cout << "周長為:" << o.side() << endl;
calculate();
break;
case 2:
cout << "輸入a邊:";
cin >> a;
s.setA(a);
cout << "面積為:" << s.area() << endl;
cout << "周長為:" << s.side() << endl;
calculate();
break;
case 3:
break;
default:
cout << "無效輸入" << endl;
calculate();
break;
}
}
/**
* 主函數
*/
int main() {
calculate();
return 0;
}
運行結果:
選擇矩形類型:
1-長方形
2-正方形
3-退出
1
輸入a邊:3
輸入b邊:5
面積為:15
周長為:30
選擇矩形類型:
1-長方形
2-正方形
3-退出
2
輸入a邊:5
面積為:25
周長為:20
選擇矩形類型:
1-長方形
2-正方形
3-退出
4
無效輸入
選擇矩形類型:
1-長方形
2-正方形
3-退出
3