这几天着重研究呃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函数中,我定义了一个基类型的引用(指针),这个指针是基类的,所以将子类的对象地址赋给它时,应该调用的是子类中继承(基类)下来的这个求面积的方法,但在子类中我把这个方法按照需要实现了了,所以它会执行我在子类中所写的这个方法来进行求面积
代码为:
#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()
{
cout<<"半径为:"<<r<<"的圆的面积为:"<<3.1415926*r*r<<endl;
}
Square::Square(double m_a)
{
a=m_a;
}
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;
}
=========over