C++继承//多态

这几天着重研究呃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=&cir;
    p->getArea();
    cout<<"请输入正方形的边长:";
    cin>>a;
    Square squ(a);
    p=&squ;
    p->getArea();
    cout<<"请输入长方形的一条边:";
    cin>>x;
    cout<<"请输入长方形的一条边:";
    cin>>y;
    Rectangle rec(x,y);
    p=&rec;
    p->getArea();
    return 0;
}


=========over

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值