essay 浅谈ACM盲区(下)

本文深入探讨面向对象编程的三大特性——继承性、封装性和多态性,通过实例解释了如何使用API,以及如何利用多态提供更多的选择。还介绍了类的封装,强调了使用者无需关心内部实现的原理。最后,讨论了继承的概念,并通过一个实战例子展示了面向对象编程的实际应用。
摘要由CSDN通过智能技术生成

好了,现在我要给大家讲讲面向对象的一些知识。上次说到了,面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。一般地,面向对象具有继承性、封装性、多态性三个特征。
举个简单的例子吧,现在我让你去用计算器计算3*4的结果,你会这么做呢?仔细想想,流程应该如下。
(1)买一个计算器;
(2)输入3*4;
(3)按下=键,获得结果。
这正好对应这三行代码:
(1)Calculator c;
(2)c.inputFormula(“3*4”);
(3)c.getResult();
所以说,面向对象与现实非常贴合,这就是面向对象受欢迎的原因之一。
有人又会疑惑了,我怎么知道计算器对象具有哪些函数呢,函数的参数扫是什么,返回值又是什么?有没有一个标准或者是文档呢?
很负责的告诉你,有的。计算器有说明书,面向对象就有API。API:application Programming Interface,应用程序编程接口。
例如,这里的计算器类的API如下所示:
这里写图片描述
根据这个API,我们可以随心所欲地使用计算器啦~
然后有人又有疑惑了,你的API中为什么setFormula()函数要重载呢?为什么接收C++的字符串之外还要写一个接收C风格的字符串呢?
这其实就是面向对象的多态性。通俗一点说,就是多种选择随我选。一个面向对象的优质代码,往往就是尽可能多给与对方(使用者)更多的选择。
此外我再通俗地说一下封装性:即内部存储和实现不关我的事。例如在计算器类中,getResult()函数是如何工作的,这个或许是字符串解析吧,或许是利用栈结构,或许是递归……反正我是不知道,也没有必要知道,我只要会用就行了。就好像我们买电视,没有人说一定要知道电视的结构、组成才能看电视吧。面向对象也是一样的原理。
最后则是面向对象的继承性。例如:
(派生)人→学生→研究生
(继承)研究生→学生→人
就是典型的一个继承。
我们写三个类(人、学生、研究生)的“恋爱”方法吧。

class Person
{
   
    int age;
    //……
    void love()
    {
        cout<<"fall in love at will"<<endl;
    }

}
class Student:public Person
{
    int age;
    //……
    void love()
    {
        cout<<"fall in love seriously"<<endl;
    }

}
class Postgraduate:public Student
{
    int age;
    //……
    void love()
    {
        cout<<"fall in love maturely"<<endl;
    }

}

总而言之,这三类人是“随心所欲的恋爱”,“认真的恋爱”,“成熟的恋爱”。如果这个时候定义一个研究生对象gth,调用“恋爱”方法后,输出的肯定是“成熟的恋爱”。

//方法(函数)覆盖(重写)


Postgraduate gth;
gth.love();

/*
输出:
fall in love maturely
*/

这个就称为方法(函数)覆盖(重写)。当然这里的覆盖并不是指一定访问不到了,只是使用起来好像是访问不到了。如果想要完全覆盖,需要使用虚函数。这里就不再赘述。
下面的概念很有趣。对于自然界很多物体(具体的或抽象的),一般都可以建立对象(实例化)。但是,对于一部分概念,其一般为一类统称,一般不希望其实例化,例如水果、动物、蔬菜……例如,“xxx,给我拿一个水果来。”这句话其实就是有问题的。
但是,“水果”作为一个概念,的确拥有一些属性(例如VC含量,重量)和方法(吃、存储)等。所以我们希望定义一个类,其指定了一部分属性和方法ÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值