在构造函数/析构函数中调用virtual函数带来的影响
生活随笔
收集整理的這篇文章主要介紹了
在构造函数/析构函数中调用virtual函数带来的影响
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在構造函數/析構函數中調用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函數,否則導致派生類的析構函數無法被執行。
總結
以上是生活随笔為你收集整理的在构造函数/析构函数中调用virtual函数带来的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 遍历Map集合的4种常用方法
- 下一篇: OpenSSL原理与实现