搜尋

首頁  >  問答  >  主體

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

黄舟黄舟2767 天前937

全部回覆(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
  • 取消回覆