当前位置:   article > 正文

C++的多态实战_c++类的多态实践报告

c++类的多态实践报告

一 指向基类指针的例子

1 代码

  1. #include <iostream>
  2. using namespace std;
  3. class CPolygon {
  4. protected:
  5. int width, height;
  6. public:
  7. void set_values(int a, int b) {
  8. width = a; height = b;
  9. }
  10. };
  11. class CRectangle : public CPolygon {
  12. public:
  13. int area(void) {
  14. return (width * height);
  15. }
  16. };
  17. class CTriangle : public CPolygon {
  18. public:
  19. int area(void) {
  20. return (width * height / 2);
  21. }
  22. };
  23. int main() {
  24. CRectangle rect;
  25. CTriangle trgl;
  26. // ppoly1和ppoly2被赋值为rect和trgl的地址,因为rect和trgl是CPolygon的子类对象,因此这种赋值是有效的。
  27. CPolygon * ppoly1 = &rect;
  28. CPolygon * ppoly2 = &trgl;
  29. ppoly1->set_values(4, 5);
  30. ppoly2->set_values(4, 5);
  31. cout << rect.area() << endl;
  32. cout << trgl.area() << endl;
  33. return 0;
  34. }

2 运行

  1. [root@localhost test]# g++ test.cpp -g -o test
  2. [root@localhost test]# ./test
  3. 20
  4. 10

3 说明

继承的好处之一是一个指向子类的指针与一个指向基类的指针是类型兼容的。

使用*ppoly1和*ppoly2取代rect和trgl的唯一限制是*ppoly1和*ppoly2是CPolygon*类型的,因此只能够引用CRectangle和CTriangle中继承的成员。正是由于这个原因,我们不能够使用*ppoly1和*ppoly2来调用成员函数area(),而只能使用rect和trgl来调用这个函数。

二 虚拟成员

1 代码

  1. #include <iostream>
  2. using namespace std;
  3. class CPolygon {
  4. protected:
  5. int width, height;
  6. public:
  7. void set_values(int a, int b) {
  8. width = a;
  9. height = b;
  10. }
  11. // 如果想在基类中定义成员留给子类进行细化,我们必须在它前面加关键字virtual,以便可以使用指针对指向相应的对象进行操作
  12. virtual int area(void) { return (0); }
  13. };
  14. class CRectangle : public CPolygon {
  15. public:
  16. int area(void) { return (width * height); }
  17. };
  18. class CTriangle : public CPolygon {
  19. public:
  20. int area(void) {
  21. return (width * height / 2);
  22. }
  23. };
  24. int main() {
  25. CRectangle rect;
  26. CTriangle trgl;
  27. CPolygon poly;
  28. CPolygon * ppoly1 = &rect;
  29. CPolygon * ppoly2 = &trgl;
  30. CPolygon * ppoly3 = &poly;
  31. ppoly1->set_values(4, 5);
  32. ppoly2->set_values(4, 5);
  33. ppoly3->set_values(4, 5);
  34. cout << ppoly1->area() << endl;
  35. cout << ppoly2->area() << endl;
  36. cout << ppoly3->area() << endl;
  37. return 0;
  38. }

2 运行

  1. [root@localhost test]# g++ test.cpp -g -o test
  2. [root@localhost test]# ./test
  3. 20
  4. 10
  5. 0

3 说明

关键字virtual的作用就是在使用基本的指针的时候,使子类中与基类同名的成员在适当的时候被调用。

注意:虽然本身被定义为虚拟类型,我们还是可以声明一个CPolygon类型的对象并调用它的area()函数,它将返回0.

三 第一个抽象基类的例子

1 代码

  1. #include <iostream>
  2. using namespace std;
  3. class CPolygon {
  4. protected:
  5. int width, height;
  6. public:
  7. void set_values(int a, int b) {
  8. width = a;
  9. height = b;
  10. }
  11. // 该函数是纯虚拟函数,包含纯虚拟函数的类被称为抽象基类
  12. virtual int area(void) = 0; // 简单地在函数声明后面写“= 0”
  13. };
  14. class CRectangle : public CPolygon {
  15. public:
  16. int area(void) { return (width * height); }
  17. };
  18. class CTriangle : public CPolygon {
  19. public:
  20. int area(void) {
  21. return (width * height / 2);
  22. }
  23. };
  24. int main() {
  25. CRectangle rect;
  26. CTriangle trgl;
  27. CPolygon * ppoly1 = &rect;
  28. CPolygon * ppoly2 = &trgl;
  29. ppoly1->set_values(4, 5);
  30. ppoly2->set_values(4, 5);
  31. cout << ppoly1->area() << endl;
  32. cout << ppoly2->area() << endl;
  33. return 0;
  34. }

2 运行

  1. [root@localhost test]# g++ test.cpp -g -o test
  2. [root@localhost test]# ./test
  3. 20
  4. 10

3 说明

抽象基类的最大不同是它不能够有实例,但我们可以定义指向它的指针。

四 第二个抽象基本的例子

1 代码

  1. #include <iostream>
  2. using namespace std;
  3. class CPolygon {
  4. protected:
  5. int width, height;
  6. public:
  7. void set_values(int a, int b) {
  8. width = a;
  9. height = b;
  10. }
  11. virtual int area(void) = 0;
  12. void printarea(void) {
  13. cout << this->area() << endl; // this代表正在被执行的这个对象的指针
  14. }
  15. };
  16. class CRectangle : public CPolygon {
  17. public:
  18. int area(void) { return (width * height); }
  19. };
  20. class CTriangle : public CPolygon {
  21. public:
  22. int area(void) {
  23. return (width * height / 2);
  24. }
  25. };
  26. int main() {
  27. CRectangle rect;
  28. CTriangle trgl;
  29. CPolygon * ppoly1 = &rect;
  30. CPolygon * ppoly2 = &trgl;
  31. ppoly1->set_values(4, 5);
  32. ppoly2->set_values(4, 5);
  33. ppoly1->printarea();
  34. ppoly2->printarea();
  35. return 0;
  36. }

2 运行

  1. [root@localhost test]# g++ test.cpp -g -o test
  2. [root@localhost test]# ./test
  3. 20
  4. 10

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/1009011
推荐阅读
相关标签
  

闽ICP备14008679号