这几天复习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函数中,我定义了一个基类型的引用(指针),这个指针是基类的,所以将子类的对象地址赋给它时,应该调用的是子类中继承(基类)下来的这个求面积的方法,但在子类中我把这个方法按照需要实现了了,所以它会执行我在子类中所写的这个方法来进行求面积
代码为:
- cout<<"半径为:"<<r<<"的圆的面积为:"<<3.1415926*r*r<<endl;
- }
- Square::Square(double m_a)
- {
- a=m_a;
- include <iostream>
- using namespace std;
- class shape
- {
- public:
- virtual void getArea();
- };
- class Circle:public shape
- {
- private:
- double r;
- public:
- Circle(double r);
- void getArea();
- };
- class Square:public shape
- {
- private:
- double a;
- public:
- Square(double a);
- void getArea();
- };
- class Rectangle:public shape
- {
- private:
- double x,y;
- public:
- Rectangle(double x,double y);
- void getArea();
- };
- void shape::getArea()
- {
- cout<<"基类的getarea函数"<<endl;
- }
- Circle::Circle(double m_r)
- {
- r=m_r;
- }
- void Circle::getArea()
- {
- }
- void Square::getArea()
- {
- cout<<"边长为:"<<a<<"的正方形的面积为:"<<a*a<<endl;
- }
- Rectangle::Rectangle(double m_x,double m_y)
- {
- x=m_x;
- y=m_y;
- }
- void Rectangle::getArea()
- {
- cout<<"长方形的面积为:"<<x*y<<endl;
- }
- int main()
- {
- shape *p;
- double r,a,x,y;
- cout<<"请输入圆的半径:";
- cin>>r;
- Circle cir(r);
- p=○
- p->getArea();
- cout<<"请输入正方形的边长:";
- cin>>a;
- Square squ(a);
- p=□
- p->getArea();
- cout<<"请输入长方形的一条边:";
- cin>>x;
- cout<<"请输入长方形的一条边:";
- cin>>y;
- Rectangle rec(x,y);
- p=&rec;
- p->getArea();
- return 0;
}