首页 > C与C++的区别

C与C++的区别

今天面试同样被问到的一个问题,C与C++的区别.
我的回答如下:
C是面向过程,C++是面向对象。
C++里有函数重载,C中没有函数重载。
C++是面向对象的,有重载 继承 多态三种特性

然后面试官问我多态的用处,坦率的讲我所理解的多态如下:

class animal
{
    virtual void speak();
    
}
class dog:public animal
{
    void speak()
    {
        cout<<"旺旺"<<endl;
    }
}
我所理解的多态就是
dog d;
animal *ptr=&d;
ptr->speak()//这个时候输出旺旺

面试时我说多态是比如基类指针指向子类对象,调用基类virtual函数时实际调用子类覆盖的虚函数。
然后面试官问,有没有一种情况下,没有多态的话你就实现不了某种功能的情况呢?
坦率的讲,对于多态我真的只有上面的一点肤浅的理解,我先搜搜相关内容,欢迎各位在此讨论,问题已加粗。


一个接口,多种实现


抖个机灵。
世界上没有实现不了的事情。如果有,就*。

世界上没有指针实现不了的事情。如果有,就指向指针的指针。


@techfellow UNIX哲学思想KISS: Keep It Simple, Stupid. 也就是道家里面的"大道至简".

程序=算法+数据结构
在过程式编程中,函数体现为算法,拿"奔跑吧兄弟"来说:
"兄弟"作为参数是输入,"奔跑"作为过程是算法.
C中可以用结构体(数据结构)对参数进行封装后传入函数(算法)操作.
也就是说,过程式强调的是"奔跑"的算法.面向对象强调的是"兄弟",而"奔跑"则只是一个动作.

面向对象三要素:封装,继承+多态.
封装是为了"去除全局变量".
继承是为了"去除代码重复".
多态是为了能让"继承"成立.

多态体现在方法重写和方法重载.
方法重写:是子类的方法覆盖父类的方法,要求方法名和参数都相同.
方法重载:是在同一个类中的两个或两个以上的方法,拥有相同的方法名,
但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数.

问:有没有一种情况下,没有多态的话你就实现不了某种功能的情况呢?
答:在继承的前提下,在你需要方法重写或重载的时候。
比如你有一个 汽车类 作为父类,类中有 启动引擎 的方法,内燃机汽车 和 燃料电池汽车 都继承了汽车这个类,因为发动机工作原理各有不同,显然需要重写 启动引擎 这个方法。


你说的是面向过程和面向对象的区别,而不是c和c++的区别。。。
建议: effective c++


google搜下便有答案: https://www.quora.com/Whats-the-difference-between-C-and-C++


对于第二个问题: 如果多态指的是技术,答案是没有,因为从技术上看,面向对象只是面向过程的语法糖;如果指思想,答案是有,没有多态的思想,许多接口设计会寸步难行。


面向对象三个基本特征:封装,继承,多态。
多态性相对于前二者而言是最灵活的,也是面向对象比较核心的部分。
但针对面试官的问题:没有多态就不能实现某种功能的情况,答案是否定的。
很多重要的系统及应用,考虑到性能及开发流程,使用机构化语言(C)的更多。
只能说,使用了多态,能让某些功能的实现看起来更“优雅”。
当年C++的作者劝说UNIX的作者用C++编写系统时,后者只是微笑沉默拒绝。这其中有自己的哲学。


最后一个问题,估计是想让你用c来模拟多态,大体的思路是,使用结构体+函数指针来模拟类,使用工厂函数来给函数指针赋值,最后通过使用结构体.成员函数的来触发调用,完成多态的实现方式。

【热门文章】
【热门文章】