c++中基類和派生類遵循型別相容原則:即可用派生類的物件去初始化基類的物件,可用派生類的物件去初始化基類的引用,可用派生類物件的位址去初始化基類物件指標。
c++中動態繫結條件發生需要滿足2個條件:
1:只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不能進行動態繫結
2:必須通過基類型別的引用或指標進行函式呼叫
基類型別引用和指標的關鍵點在於靜態型別和動態型別可能不同:
1:什麼是靜態型別?就我的理解來說,所謂的靜態型別是指,當我們用上述引用或指標去呼叫非虛函式是,這時的引用和指標就是引種靜態型別的,它對非虛函式的呼叫是在編譯時就確定了
2:從靜態型別的對立來看,所謂的動態型別也很明顯,當這個引用或指標呼叫了虛函式時,它就是動態型別,它的行為要到程式執行時才能定義
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define cl(arr, val) memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define l(x) (x) << 1
#define r(x) (x) << 1 | 1
#define mid(l, r) (l + r) >> 1
#define min(x, y) (x) < (y) ? (x) : (y)
#define max(x, y) (x) < (y) ? (y) : (x)
#define e(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define out(x) printf("%i64d\n", x)
#define lowbit(x) (x)&(-x)
#define read() freopen("data.in", "r", stdin)
#define write() freopen("d.out", "w", stdout)
#define ll unsigned long long
#define m 100007
#define n 100007
using namespace std;
const int inf = 0x7f7f7f7f;
const int mod = 1000000007;
const ll r = ((1ull<<63) - 1);
class a
virtual void test()
};class b: public a
; void test()
};int main()
執行以上程式我們會發現將用派生類的物件去初始化基類的物件時,沒有存在動態繫結,而是直接呼叫了基累的函式。其實我們上邊提到了,發生動態繫結的第二個條件已經說了,必須是基累的引用或者指標。如果用物件直接初始化的化會自動呼叫基類的複製建構函式或者過載的賦值操作符。進行截斷處理把不屬於基類的派生類中的部分去掉。
C 中的動態繫結
c 中基類和派生類遵循型別相容原則 即可用派生類的物件去初始化基類的物件,可用派生類的物件去初始化基類的引用可用派生類物件的位址去初始化基類物件指標。c 中動態繫結條件發生需要滿足2個條件 1 只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不能進行動態繫結 2 必須通過...
C 中的動態繫結
首先說明一下c 中的靜態繫結和動態繫結 靜態繫結 在編譯時刻,根據變數的靜態型別 變數宣告為基類還是派生類 來決定呼叫哪個函式,用基類宣告的,就呼叫基類的方法,用派生類宣告的就呼叫派生類的方法。動態繫結 在執行時刻,根據變數實際指向的物件型別 該變數指向基類還是派生類 來決定呼叫哪個函式。c 中對普...
C 中動態繫結
動態繫結 dynamic binding 將繫結 binding 即解析型別 成員和操作的過程從編譯時延遲到執行時。動態繫結適用於那些開發者知道某個特定的函式 成員或操作的存在,而編譯器不知道的情況。這種情況通常出現在操作動態語言 例如 ironpython 和com時。在這些情況下,如果不使用動態...