c++中的继承和多态

本文通过一个具体的图形面积计算程序案例,深入探讨了C++中的继承与多态概念。详细介绍了三种继承方式(public、private 和 protected)的特点及区别,并通过虚函数的使用演示了多态的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天复习C++的继承和多态两个重要章节;

通过一个题,不断的优化达到理解的效果,继承的重点在于三种继承方式的区别

public private protected

public继承:基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问

private继承:基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问

protected继承:基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问

 

public继承:派生类的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员

private继承:派生类的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员

protected继承:派生类的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员

 

public继承:通过派生类的对象只能访问基类的public成员

private继承:通过派生类的对象不能访问基类中的任何成员

protected继承:通过派生类的对象不能访问基类中的任何成员

 

三种方式对派生类的成员函数是一样的,都可以访问基类中的public和protected成员,但不能访问基类的private成员

对派生类的对象public方式可访问基类的public成员,private方式和protected方式不能访问基类中的任何成员

 

protected水平访问时同private,垂直访问时对派生类与public成员性质相同,即数据隐藏,又方便继承

 

多态部分,主要是虚函数:将基类中的某一函数定义为虚函数,就是要告诉编译器,“我不知道该函数是如何实现的,请一直等到它在程序中被调用,然后再从对象实例中获得函数的实现”

下面是我所提到的那个问题,其中用到了继承和多态,请深刻领会这种抽象的思考问题的思想。

一个程序:
父类:图形,方法:求面积
子类:圆形,方形,长方形

在main函数里面,给定一个图形(圆形,方形,长方形),求它的面积

先定义图形这个基类,里面有求面积这个方法,并把这个方法设定为虚函数,但是具体以后遇到什么图像,怎么实现,我不知道,我只知道任何一个图像都应该有求面积的方法,而后的子类(如圆形)它继承了图形这个基类,所以它也有求面积这个虚函数(从父类继承下来的)。在子类里,我要把这个方法的内部实现重新写一下;在main函数中,我定义了一个基类型的引用(指针),这个指针是基类的,所以将子类的对象地址赋给它时,应该调用的是子类中继承(基类)下来的这个求面积的方法,但在子类中我把这个方法按照需要实现了了,所以它会执行我在子类中所写的这个方法来进行求面积

代码为:

  1.     cout<<"半径为:"<<r<<"的圆的面积为:"<<3.1415926*r*r<<endl;  
  2. }  
  3. Square::Square(double m_a)  
  4. {  
  5.     a=m_a;  
  6. include <iostream>   
  7.   
  8. using namespace std;  
  9. class shape  
  10. {  
  11. public:  
  12. virtual void getArea();  
  13. };  
  14. class Circle:public shape  
  15. {  
  16. private:  
  17.     double r;  
  18. public:  
  19.     Circle(double r);  
  20.     void getArea();  
  21. };  
  22. class Square:public shape  
  23. {  
  24. private:  
  25.     double a;  
  26. public:  
  27.     Square(double a);  
  28.     void getArea();  
  29. };  
  30. class Rectangle:public shape  
  31. {  
  32. private:  
  33.     double x,y;  
  34. public:  
  35.     Rectangle(double x,double y);  
  36.     void getArea();  
  37. };  
  38. void shape::getArea()  
  39. {  
  40.     cout<<"基类的getarea函数"<<endl;  
  41. }  
  42. Circle::Circle(double m_r)  
  43. {  
  44.     r=m_r;  
  45. }  
  46. void Circle::getArea()  
  47. {  
  48. }  
  49. void Square::getArea()  
  50. {  
  51.     cout<<"边长为:"<<a<<"的正方形的面积为:"<<a*a<<endl;  
  52. }  
  53. Rectangle::Rectangle(double m_x,double m_y)  
  54. {  
  55.     x=m_x;  
  56.     y=m_y;  
  57. }  
  58. void Rectangle::getArea()  
  59. {  
  60.     cout<<"长方形的面积为:"<<x*y<<endl;  
  61. }  
  62. int main()  
  63. {  
  64.     shape *p;  
  65.     double r,a,x,y;  
  66.     cout<<"请输入圆的半径:";  
  67.     cin>>r;  
  68.     Circle cir(r);  
  69.     p=&cir;  
  70.     p->getArea();  
  71.     cout<<"请输入正方形的边长:";  
  72.     cin>>a;  
  73.     Square squ(a);  
  74.     p=&squ;  
  75.     p->getArea();  
  76.     cout<<"请输入长方形的一条边:";  
  77.     cin>>x;  
  78.     cout<<"请输入长方形的一条边:";  
  79.     cin>>y;  
  80.     Rectangle rec(x,y);  
  81.     p=&rec;  
  82.     p->getArea();  
  83.     return 0;  

}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值