今天面试同样被问到的一个问题,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函数时实际调用子类覆盖的虚函数。
然后面试官问,有没有一种情况下,没有多态的话你就实现不了某种功能的情况呢?
坦率的讲,对于多态我真的只有上面的一点肤浅的理解,我先搜搜相关内容,欢迎各位在此讨论,问题已加粗。
PHP中文网2017-04-17 13:04:28
google搜下有答案: https://www.quora.com/Whats-the-difference-between-C-and-C++
對於第二個問題: 如果多態性指的是技術,答案是沒有,因為從技術上上看,面向對像只是面向過程的語法糖;如果指思想,答案是有,沒有多態性的思想,許多介面設計會寸步難行。
PHPz2017-04-17 13:04:28
物件導向三個基本特徵:封裝,繼承,多型。
多態性相對於前二者而言是最靈活的,也是物件導向比較核心的部分。
但針對面試官的問題:沒有多型就不能實現某種功能的情況,答案是否定的。
許多重要的系統及應用,考慮到效能及開發流程,使用機構化語言(C)的更多。
只能說,使用了多態,能讓某些功能的實現看起來更「優雅」。
當年C++的作者勸說UNIX的作者用C++編寫系統時,後者只是微笑沉默拒絕。這其中有自己的哲學。
巴扎黑2017-04-17 13:04:28
最後一個問題,估計是想讓你用c來模擬多態,大體的思路是,使用結構體+函數指針來模擬類,使用工廠函數來給函數指針賦值,最後通過使用結構體.成員函數的來觸發調用,完成多態的實作方式。
迷茫2017-04-17 13:04:28
C 與 C++ 的真正差異在哪裡?一些差異: C: 寫C程式碼,寫出來的是C程式碼。 C++:寫C++程式碼,寫出來的還是C程式碼。 http://www.zhihu.com/question... (分享自知乎網)
PHP中文网2017-04-17 13:04:28
@techfellow UNIX哲學思想KISS: Keep It Simple, Stupid. 也就是道家裡面的"大道至簡".
程式=演算法+資料結構
在過程式編程中,函數體現為演算法,拿"奔跑吧兄弟"來說:
"兄弟"作為參數是輸入,"奔跑"作為過程是演算法.
C中可以用結構體(資料結構)對參數進行封裝後傳入函數(演算法)操作.
也就是說,過程式強調的是"奔跑"的演算法.物件導向強調的是"兄弟",而"奔跑"則只是一個動作.
物件導向三要素:封裝,繼承+多態性.
封裝是為了"去除全域變數".
繼承是為了"去除程式碼重複".
多態是為了能讓"繼承"成立.
多態體現在方法重寫和方法重載.
方法重寫:是子類別的方法覆蓋父類別的方法,要求方法名稱和參數都相同.
方法重載:是在同一個類別中的兩個或兩個以上的方法,擁有相同的方法名,
但是參數卻不相同,方法體也不相同,最常見的重載的例子就是類別的建構子.
問:有沒有一種情況下,沒有多態的話你就實現不了某種功能的情況呢?
答:在繼承的前提下,在你需要方法重寫或重載的時候。
例如你有一個汽車類作為父類,類中有啟動引擎的方法,內燃機汽車和燃料電池汽車都繼承了汽車這個類,因為發動機工作原理各有不同,顯然需要重寫啟動引擎這個方法。