zoukankan      html  css  js  c++  java
  • C++抽象类

    1.为什么要有抽象类

    我们举一个例子,程序有两个类,椭圆Ellipse类,圆Circle类。
    我们知道椭圆是包括圆的,那么我们可以使用继承:

    class Ellipse
    {};
    class Circle:public Ellipse
    {};

    然而,我们在定义各自的成员变量和成员函数时,发现两个类的成员有很大的不同,
    比如Ellipse类需要长短轴半径,中心坐标,方向角才能确定位置,另外还包括移动椭圆,返回椭圆面积,旋转椭圆的方法。
    而Circle类只需要半径,中心坐标,就能确定位置,旋转方法对圆来说也是没有意义的。
    可以看出,若简单使Circle继承Ellipse,将使简单的问题复杂化。

    2.什么是抽象类

    解决的方法是,我们可以抽象出Ellipse类,Circle类的公共部分

    class BaseEllipse
    {
    private:
        double x;
        double y;
    public:
        BaseEllipse(double a,double b):x(a),y(b){}
        virtual ~BaseEllipse(){}
        void Move(int a,int b){x=a;y=b;}
        virtual double Area() const=0;//纯虚函数
    };

    当类声明中有纯虚函数,比如virtual double Area()=0;时,该类就是抽象类。
    抽象类不能实例化,子类继承抽象类时,必须定义纯虚函数。

    class Ellipse:public BaseEllipse
    {
    public:
        virtual double Area() const
        {
            std::cout<<"Ellipse::Area()"<<std::endl;
        }
    };
    class Circle:publi BaseEllipse
    {
    public:    
        virtual double Area() const
        {
            std::cout<<"Circle::Area()"<<std::endl;
        }
    };

    3.抽象类与普通基类
    由上面的讲解,可看出,抽象类与普通基类的区别是,
    普通基类表现的是一种父子关系,比如人和学生的关系。
    抽象类更像是一种接口规则的约定
    比如规定了一些公共的move()方式,对人来说,移动的方式是“走”,对鸟来说,是“飞”,对鱼来说,是“游”
    该约定类不能实例化,所有继承自抽象类的子类都必须覆盖其纯虚函数,迫使派生类遵循接口规则。

     参考资料:《C++ Primer.Plus》 pp.508-516

  • 相关阅读:
    分享一个在线生成站点地图SiteMap制作工具
    去掉tppabs冗余代码,怎样批量去掉tppabs代码
    js文字无缝滚动
    史上最全的Win8快捷键大全
    原码, 反码, 补码
    Java [Leetcode 136]Single Number
    拉格朗日对偶
    随机森林与GBDT
    GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
    Java [Leetcode 165]Compare Version Numbers
  • 原文地址:https://www.cnblogs.com/shijingjing07/p/5562434.html
Copyright © 2011-2022 走看看