在構造函數/析構函數中調用virtual函數,那麼調用的一定是本類中的virtual函數。
先看一段代碼:
#include<iostream>
class Base {
public:
Base() {
print();
}
~Base() {
print();
}
virtual void print() {
std::cout << "Base::print" << std::endl;
}
};
class Drived : public Base {
public:
Drived() {
print();
}
~Drived() {
print();
}
virtual void print() {
std::cout << "Drived::print" << std::endl;
}
};
int main() {
Base *b = new Drived();
delete b;
return 0;
}
執行結果如下:
從結果中可以看到:
(1)、Base基類中的構造函數中調用virtual函數,調用的是本類中的virtual函數
Base基類中的析構函數中調用virtual函數,調用的也是本類中的virtual函數
(2)、Drived派生類中的構造函數中調用virtual函數,調用的是本類中的virtual函數
Drived派生類中的析構函數中調用virtual函數,調用的也是本類中的virtual函數
根本原因:
虛指針是在構造函數中創建的,在析構函數中銷燬的。如果在構造函數/析構函數中調用virtual函數,那麼調用的一定是本類中的virtual函數。
此外:對於上的結果中沒有執行Drived派生類的析構函數,是因爲基類的析構函數不是virtual函數導致的。
因此,基類的析構函數一定要是virtual函數,否則導致派生類的析構函數無法被執行。