回 帖 发 新 帖 刷新版面

主题:[原创]C++第二讲---继承

共和国的发展一日千里,程序代码也是如此,如此数量的代码,有了错误怎么修改,如需求变更,怎么升级?????
    在这样的困境中,减少代码量是一种解决之道。工程师们在不断的思索,最终发现,一个大的程序有很多部分的代码量是完全一样的,一个几十万行的程序描述的事物千姿百态,这么多的事物之间有很多相似点,有一定的发展关系。各个事物都在“与时俱进”,从低级到高级。举例来说吧,人们最早发明了风筝,后来发明了飞机。人们发明了汽车之后,又发明了火车,数学家在认识圆形之后,又认识了矩形,从矩形又认识了圆锥。图示


    用我们上节的类的思想,描述程序如下:
class Circle//圆形类
{
public:
    int x;//圆心横坐标
    int y;//圆心纵坐标
    int r;//圆的半径
    double Girth()//圆的周长
    {
        return 2*3.1415926*r;
    }
};

class Column:public Circle//圆柱体类,继承开始了
{
public:
    int h;//圆柱体的高
    double Area()//圆的面积
    {
        return 2*3.1415926*r*r+Girth()*h;//调用继承过来的r,h
    }
    double V()//圆的体积
    {
        return 3.1415926*r*r*h;//调用继承过来的r,h
    }
    void Disp()//信息打印
    {
        printf("%f\n",Area());
        printf("%f\n",V());
    }
};

void main()//主函数
{
    Column c1;//类与对象
    c1.x=0;c1.y=0;c1.r=3;c1.h=5;//对象的初始化
    c1.Disp();//对象调用成员函数
}
    结果:
   150.796445
   141.371667
 
    ^_^,这是最简单的继承,也就是这样,减少了代码书写量,方便了程序的修改与升级,继承还有很多其它的概念,protected,private继承,多继承,二义性等其它问题,我们以后探讨。

[em9][em9][em9]

回复列表 (共22个回复)

沙发

顶了

板凳

希望楼主 至少设计一个构造函数,来为对象赋值。
没有构造函数,没有虚函数,就直接开始讲继承,
我觉得这对初学者没有多大意义,因为连一个类的设计的目的都没有理解,哪里会理解继承的意义!

难道楼主,下一讲就是STL吗。


ps:偶是一个初学者,而且C++学的根本不明白,
    只是一些表面的概念还可以看懂点。

3 楼

回复上楼
构造函数在以后讲述
还有3种权限以后讲述
如果用了没有讲的,怕初学者看着迷糊

我是对照刚开始学习的人,没有什么基础的,一点一点向下讲述的,实例的内容是我所讲述的内容,如果没有讲述的,我不会使用,怕初学者感到意外,我将一点一点讲述

4 楼

我说一点吧。
其实C++是既支持面向过程的编程风格,又支持面向对象的编程风格的。
如果是入门讲解,建议先讲一些面向过程编程风格的东西,比如输入/输出、函数内联、函数重载、new/delete、模板等。

5 楼

楼主辛苦了。的确是初学者的福音。

我补充一下:

面向对象的经典著作:《设计模式》(Design Patterns)、《重构》(Refactoring)

泛型编程的经典著作:《STL源码刨析》(侯捷著)、《泛型编程与STL》

学习面向对象的目的是在设计的时候尽可能的减少各个对象之间的依赖关系,从而将某对象的变动所造成的影响减少到最小程度。比较成熟的经验例如依赖倒置、所有对象依赖于虚而非依赖于实等等。

学习范型编程的目的是在不破坏面向对象的基础上偷懒,将对象泛化,从而用一个范型对象代替一系列实际对象,用一个范型算法代替一系列类似算法,同时保证时空效率。偷懒是容易的,模板就是偷懒的最好工具。但是要在保证效率的基础上偷懒,还不能破坏面向对象的基本规则,那就涉及到泛型思想的精髓了。

6 楼

支持楼主继续为初学者的讲解。

7 楼

学习中,谢谢楼主的及时雨。

8 楼

楼主辛苦!  敬礼!

9 楼

可以理解,但是不知道公式正不正确。
#include<iostream.h>
#include<math.h>
const float pi=3.14;
class Circle//圆形类
{
public:

    float r;//圆的半径
    float Girth()//圆的周长
    {
        return 2*pi*r;
    }
};

class Column:public Circle//圆柱体类,继承开始了
{
public:
    float h;//圆柱体的高
    float Area()//圆柱体的表面积
    {
        return 2*pi*r*r+Girth()*h;//调用继承过来的r,h
    }
    float V()//圆柱体的体积
    {
        return pi*r*r*h;//调用继承过来的r,h
    }
    void Disp()//信息打印
    {
        cout<<"圆柱体的表面积:"<<Area()<<endl;
        cout<<"圆柱体的体积:"<<V()<<endl;    
    }
};
class ball:public Circle//球类
{public:
    float Area()//球的表面积
      {return 4*pi*r*r;}
    float v()//球的体积
      {return (4*pi*r*r*r)/3;}
void Disp()
      {cout<<"球的表面积:"<<Area()<<endl;
       cout<<"球的体积:"<<v()<<endl;
      }
};
class cone :public Circle //圆锥体类
{public:
     float l;//母线长
     float h;//高
     float Aver()//圆锥体的表面积
       {l=sqrt(r*r+h*h);
       return pi*r*l+pi*r*r;}
     float v()//圆锥体的体积
     {return (pi*r*r*r)/3;}
     void Disp()
     {cout<<"圆锥体的表面积:"<<Aver()<<endl;
      cout<<"圆锥体的体积:"<<v()<<endl;}
};
void main()//主函数,如果不加void,就在"co.Disp();"加 "return 0;"
{
    Column c1;//类与对象
    c1.r=1;c1.h=2;//对象的初始化
    c1.Disp();//对象调用成员函数
    ball b;
    b.r=2;
    b.Disp();
    cone co;
    co.r=3;co.h=4;
    co.Disp();
}

10 楼


五楼的说的不错!
当然也感谢楼主的工作!

我来回复

您尚未登录,请登录后再回复。点此登录或注册