2021.17.18牛客
阿新 • • 發佈:2021-07-18
過載overload和重寫override(雖然這個很熟悉但是整一下)
過載,就是同名函式,不同引數實現的不同函式,和返回值無關
重寫,就是子類繼承父類的virtual修飾的函式,重新實現函式
都實現多型性
被final修飾的類就不能被繼承,所以被final修飾的函式不能被重寫override
靜態聯編和動態聯編
如果是直接使用物件名字呼叫的虛擬函式,就知道是哪個類呼叫的虛擬函式,所以是靜態聯編,如果是指標呼叫的話,不知道具體是哪個類,就叫動態聯編。
虛擬函式表
在32系統中,在物件聲明瞭虛擬函式的會比該類沒有宣告虛擬函式多出4個位元組,他的派生類也會多出4個位元組,就是儲存虛擬函式表的指標
呼叫的時候通過虛擬函式表查詢,呼叫虛擬函式。
友元函式、建構函式、行內函數、靜態函式不能宣告成虛擬函式
有些編輯器中自動就給虛擬函式加了virtual,為什麼虛擬函式要被定義為虛擬函式
不是不定義虛擬函式也會呼叫基類的解構函式嗎?
這只是靜態聯編,靜態編譯上面講了,是具體物件呼叫,如果是動態聯編,指標的析構時候只會呼叫基類的析構,不會呼叫子類的
ClxBase *p = new ClxDerived;
p->DoSomething();
delete p;
如果設定析構是虛擬函式的情況就會都呼叫。