Peronal Link: http://segmentfault.com/a/1190000002464822
这节课讲了本门课程 面向对象程序设计中最为重要的一个部分 - 多态
1 /************************************************************************* 2 > File Name: polymorphism.cpp 3 > Author: Jeremy Wu 4 > Created Time: Mon 25 May 2015 10:04:07 AM CST 5 > Function: tune every instrument 6 ************************************************************************/ 7 8 //多态:一个接口,多种实现 9 //发生多态现象的条件: 10 // 1.通过调用虚函数(基类中必须要有,派生类中可有可无建议加上) 11 // 2.借助指针或者引用调用该虚函数 12 // 13 //虚函数只能是 非静态 成员函数 14 //如果类中有虚函数,最好把 析构函数 也定义为虚函数 15 // 16 //如果基类的析构函数是虚函数,由它派生的所有的派生类的析构函数都 自动 成为虚函数 17 // ·构造函数无法定义为虚函数 18 // 19 //基类可以指向它的所有的派生类 20 //相当于基类给所有的派生类提供了统一的接口 21 //一般不会直接创建基类的对象 22 // 23 //{ 抽象基类 } 24 //如果一个类中包含纯虚函数,就是抽象类 25 //抽象类无法创建对象 26 //如果需要 避免 创建基类对象,应该使用纯虚函数 27 28 29 30 //接下来是一个例子,有一个基类叫做乐器类 31 //由它派生出Wind , Brass 和 Gitar 三个类 32 33 #include <iostream> 34 35 using namespace std; 36 37 class Instrument { 38 public: 39 virtual void play (); //virtual 关键字 40 Instrument () { cout << "Instement () " << endl; } 41 virtual ~Instrument () { cout << "~Instement () " << endl; } 42 }; 43 44 void Instrument::play () { //类的外部定义前不用加 virtual 关键字 45 cout << "Instrument::play ()" << endl; 46 } 47 48 class Wind : public Instrument{ 49 virtual void play () { cout << "Wind::play () " << endl; } //派生类中 virtual 关键字可加可不加 50 ~Wind () { cout << "Wind::~Wind ()" << endl; } 51 }; 52 53 class Brass : public Instrument { 54 virtual void play () { cout << "Brass::play ()" << endl; } 55 ~Brass () { cout << "Brass::~Brass () " << endl; } 56 }; 57 58 class Gitar : public Instrument { 59 virtual void play () { cout << "Gitar::play ()" << endl; } 60 ~Gitar () { cout << "Gitar::~Gitar ()" << endl; } 61 }; 62 63 //inst 指针在定义的时候,是静态类型 64 //在程序运行过程中,它的动态类型就会根据指向对象的类型作改变 65 // 66 //有时候把动态绑定称为运行时绑定,也称后继绑定 67 //run-time binding 68 69 void tune (Instrument * inst) { //引用传递 或者用指针 70 inst->play (); //Dynamic binding 71 //在编译时进行 动态绑定 72 } 73 74 int main () { 75 76 Instrument * p = new Gitar; 77 Instrument * p2 = new Wind; 78 79 delete p; 80 delete p2; 81 82 return 0; 83 }
接下来老师出了一道题目
描述如下:
以下是我的 Solution:
1 /************************************************************************* 2 > File Name: ployPROB.cpp 3 > Author: Jeremy Wu 4 > Created Time: Mon 25 May 2015 10:50:07 AM CST 5 ************************************************************************/ 6 7 //定义一个形状类的继承结构 8 // 9 //Shape -> Triangle 10 // -> Rectangle 11 // -> Circle 12 // 13 //给形状定义两个操作: 14 // getArea () 求面积 15 // getLength () 求周长 16 17 #include <iostream> 18 #include <cmath> 19 20 const double PI = 3.1415926; 21 22 using namespace std; 23 24 class Shape { 25 public: 26 virtual double getArea () = 0; 27 virtual double getLength () = 0; 28 virtual ~Shape () { cout << "~Shape ()" << endl; } 29 Shape () { cout << "Shape ()" << endl; } 30 }; 31 32 class Triangle : public Shape { 33 private: 34 double x, y, z; 35 public: 36 double getArea () { 37 double p = (x + y + z) / 2.0; 38 return sqrt (p * (p - x) * (p - y) * (p - z)); 39 } 40 double getLength () { return x + y + z; } 41 Triangle (double ix = 0.0, double iy = 0.0, double iz = 0.0) { 42 x = ix, y = iy, z = iz; 43 } 44 ~Triangle () { cout << "~Triangle () " << endl; } 45 }; 46 47 class Rectangle : public Shape { 48 private: 49 double x, y; 50 public: 51 double getArea () { return x * y; } 52 double getLength () { return 2.0 * (x + y); } 53 Rectangle (double ix = 0.0, double iy = 0.0) { 54 x = ix, y = iy; 55 } 56 ~Rectangle () { cout << "~Rectangle () " << endl; } 57 }; 58 59 class Circle : public Shape { 60 private: 61 double r; 62 public: 63 double getArea () { return PI * r * r; } 64 double getLength () { return 2.0 * PI * r; } 65 Circle (double ir = 0.0) { 66 r = ir; 67 } 68 ~Circle () { cout << "~Circle ()" << endl; } 69 }; 70 71 void test (Shape & sp) { 72 cout << "/***********************************/" << endl; 73 cout << ‘\t‘ << "Area is " << sp.getArea () << endl; 74 cout << ‘\t‘ << "Length is " << sp.getLength () << endl; 75 cout << "/***********************************/" << endl; 76 } 77 78 int main () { 79 80 Circle p1 (3.0); 81 Rectangle p2 (3.0, 6.0); 82 Triangle p3 (1.0, 2.0, 1.5); 83 84 test (p1); 85 test (p2); 86 test (p3); 87 88 return 0; 89 }
以下是官方版 Solution:
1 /************************************************************************* 2 > File Name: example.cpp 3 > Author: Jeremy Wu 4 > Created Time: Mon 25 May 2015 11:34:47 AM CST 5 ************************************************************************/ 6 7 #include <iostream> 8 #include <cmath> 9 10 using namespace std; 11 12 class Shape { 13 public: 14 virtual double area () = 0; //不实现基类可以这么写,表示定义一个纯虚函数 15 virtual double zhou () = 0; //pure virtual function 16 }; 17 18 class Triangle : public Shape { 19 double a, b, c; 20 public: 21 Triangle (double aa, double bb, double cc) : a (aa), b (bb), c (cc) {} 22 virtual double area () { 23 double p = 0.5 * (a + b + c); 24 return sqrt (p * (p - a) * (p - b) * (p - c)); 25 } 26 virtual double zhou () { 27 return a + b + c; 28 } 29 }; 30 31 class Rectangle : public Shape { 32 double a, b; 33 public: 34 Rectangle (double aa, double bb) : a (aa), b (bb) {} 35 virtual double area () { 36 return a * b; 37 } 38 virtual double zhou () { 39 return 2.0 * (a + b); 40 } 41 }; 42 43 class Circle : public Shape { 44 double r; 45 public: 46 Circle (double rr) : r (rr) {} 47 virtual double area () { 48 return 3.14159 * r * r; 49 } 50 virtual double zhou () { 51 return 2.0 * 3.14159 * r; 52 } 53 }; 54 55 void printArea (Shape * p) { 56 cout << p->area () << endl; 57 } 58 59 void printZhou (Shape * p) { 60 cout << p->zhou () << endl; 61 } 62 63 int main () { 64 65 Shape * p1, * p2, * p3; 66 67 //Shape sp; 68 69 p1 = new Triangle (6, 7, 8); 70 p2 = new Rectangle (10, 4.6); 71 p3 = new Circle (5.8); 72 73 printArea (p1); 74 printArea (p2); 75 printArea (p3); 76 77 printZhou (p1); 78 printZhou (p2); 79 printZhou (p3); 80 81 return 0; 82 }
时间: 2024-10-07 13:22:57