關於c++的多態,多態
前不久面了一下金山,一面比較順利。二面的時候面試官主要問了問c++的問題,貌似回答的不好,後來又問道關於多態的問題,讓我描述一下,或者寫一個例子出來,我當時就2了,故在此溫習一下。
多態,字面意思就是“多種狀態”。在oop(物件導向)中,介面的多種不同的實現方式即為多態。多態性是允許你將父物件設定成為和一個或更多他的子物件相等的技術,賦值以後,父物件就可以根據當前賦給它的子物件的特性以不同的方式運作。簡單的說,就是:允許將子類型的指標賦值給父類型的指標。
在c++中,實現多態有以下方法:虛函數,抽象類別,重寫,覆蓋,模板。
我先以虛函數去實現一個。
#include <iostream>using namespace std;class A{public:A(){}~A(){}virtual void fun(){cout<<"this is A"<<endl;}};class B:public A{public:B(){}~B(){}void fun(){cout<<"this is B"<<endl;}};int main(){A *a = new A();A *b = new B();a->fun();b->fun();if (a != NULL)delete a;if (b != NULL)delete b;return 0;}
運行結果如下:
用標準C怎實現多態
struct Base
{
int (*foo_ptr)(Base *);
};
struct Derived_A
{
struct Base;
int x;
};
int Derived_A_foo(Base *p)
{
return ((Derived_A *)p)->x;
}
void Derived_A_Construct(Derived_A *p)
{
p->foo_ptr = Derived_A_foo;
p->x = 0;
}
struct Derived_A a;
struct Base *x = (Base *)a;
Derived_A_Construct(&a);
x->foo_ptr(x);
不是嚴格的做法,就是說明大概的意思
c加加多態的種類,各自實現的機制
多態,即“一個介面,多種實現”。
C++中的多態,可分為靜態多態,包括:函數重載、模板;動態多態,包括:虛函數。
靜態,在編譯時間就要知道調用函數的全部資訊,而動態,直到運行時才確定具體調用的函數。具體可以分別查一下”函數重載“,”模板“,”虛函數“這三個關鍵字看看。