我们研究一下继承和虚函数。
比如我们需要求正方形、长方形的周长、面积:
选择1计算长方形
选择2计算正方形
选择3退出
其他无效
我们做一个继承实现,父类矩形,子类有正方形、长方形继承矩形
C++的继承语法如下:
矩形
正方形
长方形
对正方形、长方形求面积、周长。面积公式相同,在矩形父类完成,函数 area();周长公式不同,在各个子类种实现。这里有一个虚函数 side()。
让函数 side()=0;是在此定义,由子类实现。类似于Java的抽象父类,指定需要子类实现的方法。
矩形类:
设置了a、b两边且为 protected供子类直接使用,给出了求面积的函数实现 area(),同时定义了求边长的函数 side(),要求函数 side()由子类实现。
正方形类:
实现了求边长函数 side(),同时加入设置边函数 setA(int a)。
长方形类:
实现了求边长函数 side(),同时加入设置边函数 setA(int a)和 setB(int b)。
根据输入做相应计算:
给出整体代码:
运行结果:
相关链接:
C/C++ 学习手札(一)
C/C++ 学习手札(二)
C/C++ 学习手札(三)
![](/images/smiles/icon_biggrin.gif)
比如我们需要求正方形、长方形的周长、面积:
选择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
![](/images/smiles/icon_biggrin.gif)
相关链接:
C/C++ 学习手札(一)
C/C++ 学习手札(二)
C/C++ 学习手札(三)