虚函数,纯虚函数,抽象类,点H与点CPP文件的结合

来源:互联网 发布:网络直播发展现状 编辑:程序博客网 时间:2024/05/16 12:45

- - - - - - - - - - - - - 触控未来的日子–Day 52- - - - - - - - - - - - - -

哎呀,我居然三天都没有写博客了,一二三的三!
先来回顾一下上周的考试,因为被冠上了比武的噱头,让我情不自禁的对这次考试非常的重视,重视到略显紧张。三个半小时的考试我一趟厕所都没有上,我为自己的肾代言。
我是最后一个交卷的,不知道其他人有没有跟我一样的情况,交卷以前检测了N遍都没有找到的错误,会在交卷的后的一刹那自动在脑海闪现。对于这种情况,我只能优雅的感叹一句“真是日了狗了”!

我居然可以将if…else if和if…if一视同仁,这是变瞎的前兆吗?

题目:七月一号是周五,打印当月每个周日的日期和周日总的次数

#include<stdio.h>int main(){    int i = 1,j = 1;    for(i = 1;i <= 31;i++)    {        if(i ==3)            printf("第%d个周日是:%d号",j,i);        if((i - 3)%7 == 0)        {            j++;            printf("第%d个周日是:%d号",j,i);        }    }    printf("七月总共有%d个周日",j);    getchar();    return;}

然后我就发现周五的总数比正确答案多了一个,因为两个if在判断时出现重复,那就是i==3的情况,用if…else if…就对了。

回顾一下过去一个月的C语言学习,发现自己还是有很多的地方很模糊,甚至是不理解从近往远说:
1,不同情况下构造函数的调用顺序。
2,共用体的在内存里面的储值方式和规则。(周末时遇到的问题:关于double型成员最先赋值和最后赋值时远行出两种不同的结果我我还是无法理解)
3,我对枚举体这个东西存在的意义很疑惑,通俗点,现阶段看来,我觉得它没有什么卵用。
4,结构体成员里面包含有数组的问题。
5,函数的递归我从来不敢掉以轻心。
6,各种数据类型的转换问题,精度缺失问题的内部成因不是特别清晰。

- - - - - - - - - - - - - - - - - - 今日内容- - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - 多态- - - - - - - - - - - - - - - - - - - -

多态的第一个方式

1.创建类,并且定义虚函数
2.虚函数作用,让每个类都可以覆盖这个方法的内容
3.如果我的类中有纯虚函数就默认为抽象类
4.抽象类是不允许创建对象的

虚函数区别与普通函数的一个标志:virtual
纯虚函数的定义方式:virtual void callme() = 0;

虚函数跟重载函数是两个概念,在基类定义了虚函数以后,在继承类里面可以改方法体,实现不同功能,这是一种覆盖。

重点:点H文件与CPP文件的绑定:
1,点H文件的名称与该文件下的类名一致
2,点H文件下的类内部值负责成员函数的声明,具体的功能实现在CPP文件里完成。

应用点H文件的方式:

#include”Base.h” //表示应用了名为Base的头文件
#ifndef BASE_H //必须有(虽然我不明白原理)
#define BASE_H
#endif //与ifndef同在,必须有(虽然我不明白原理)

什么是声明,什么是定义(就这个问题搞了一下午)

1,声明是不分配内存的,定义才会分配内存。
2,基本数据类型(int,char,float,double)声明就是定义,比如int i;它既是声明也是定义。
3,仅代表对基本数据类型专门声明的情况只有一种:extern int i,代表i这个变量是在别的地方定义了(如果你发现在接下来的代码中i是有一个固定值的,请不要大惊小怪)
4,函数,结构体,公用体,类的声明与定义的区别就很明显,不做赘述。

http://blog.csdn.net/u010355144/article/details/44942847

代表性的题目:

写一个程序,定义一个带有纯虚函数的基类Shape,由它派生出5个派生类:圆形(Circle)、矩形(Rectangle)、正方形(Square)、三角形(Triangle)、梯形(Trapezoid)。实现基类中的虚函数,分别计算几种图形的面积。要求:使用基类型的指针数组,使数组的每个元素分别指向一个派生类的对象。使用多态的概念实现对于求面积方法的调用。并给出适当的输入输出提示。

#include<iostream>#include<string>using namespace std;#define PI 3.14/*基类-形状*/class Shape{public :    virtual void area() = 0;   //纯虚函数   };/*圆形*/class Circle: public Shape{public :    void area()    {        cout<<"\n"<<"输入圆的半径:"<<endl;        cin>>r;        getchar();        cout<<"面积: "<<PI*r*r<<endl;    }private:    double r;   };/*矩形*/class Rectangle: public Shape{public :    void area()    {        cout<<"\n"<<"输入矩形的长,宽: "<<endl;        cin>>len;        getchar();        cin>>wigth;        getchar();        cout<<"面积: "<<len*wigth<<endl;    }private:    double len,wigth;};/*正方形*/class Square : public Shape{public :    void area()    {        cout<<"\n"<<"输入正方形的边长"<<endl;        cin>>L;        getchar();        cout<<"面积: "<<L*L<<endl;    }private:    double L;};/*三角形*/class Triangle: public Shape{public :    void area()    {        cout<<"\n"<<"输入三角形的底边长,高"<<endl;        cin>>L1;        getchar();        cin>>higth1;        getchar();        cout<<"面积: "<<L1*higth1<<endl;    }private:    double L1,higth1;};/*梯形*/class Trapezoid: public Shape{public :    void area()    {        cout<<"\n"<<"输入梯形的底边长,高"<<endl;        cin>>L2;        getchar();        cin>>higth2;        getchar();        cout<<"面积: "<<L2*higth2<<endl;    }private:    double L2,higth2;};int main(){       Shape*a[5];    a[0] = new Circle;    a[0]->area();    a[1] = new Rectangle;    a[1]->area();    a[2] = new Square;    a[2]->area();    a[3] = new Triangle;    a[3]->area();    a[4] = new Trapezoid;    a[4]->area();    getchar();    return 0;}
0 0
原创粉丝点击