首页  >  问答  >  正文

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

黄舟黄舟2717 天前899

全部回复(8)我来回复

  • PHP中文网

    PHP中文网2017-04-17 13:04:28

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


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

    回复
    0
  • PHPz

    PHPz2017-04-17 13:04:28

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

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-17 13:04:28

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

    回复
    0
  • 迷茫

    迷茫2017-04-17 13:04:28

    C 与 C++ 的真正区别在哪里?一些区别: C: 编写C代码,写出来的是C代码。 C++:编写C++代码,写出来的是还是C代码。http://www.zhihu.com/question... (分享自知乎网)

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 13:04:28

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

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 13:04:28

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

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

    回复
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:04:28

    一个接口,多种实现

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 13:04:28

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

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

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

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

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

    回复
    0
  • 取消回复