Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การเรียกใช้ฟังก์ชันเสมือนภายในตัวสร้างใน C ++


ฟังก์ชันเสมือนที่เรียกจากคอนสตรัคเตอร์หรือ destructor เป็นสิ่งที่อันตรายและควรหลีกเลี่ยงเมื่อใดก็ตามที่เป็นไปได้ เนื่องจากฟังก์ชันเสมือนที่เราเรียกนั้นถูกเรียกจากคลาส Base ไม่ใช่จากคลาสที่ได้รับ

เหตุผลก็คือใน C ++ Super-classes นั้นถูกสร้างขึ้นก่อนคลาสที่ได้รับ ดังนั้น ในตัวอย่างต่อไปนี้ เนื่องจาก B จะต้องสร้างอินสแตนซ์ ก่อนที่ D จะถูกสร้างอินสแตนซ์ เมื่อคอนสตรัคเตอร์ของ B ถูกเรียก มันยังไม่ใช่ D ดังนั้นตารางฟังก์ชันเสมือนยังคงมีรายการสำหรับสำเนาของ s() ของ B

โค้ดตัวอย่าง

#include<iostream>
using namespace std;
class B {
   public: B() {
      s();
   }
   virtual void s() {
      cout << "Base" << endl;
   }
};

class D: public B {
   public: D() : B() {}
   virtual void s() {
      cout << "Derived" <<endl;
   }
};

int main() {
   D de;
}

ผลลัพธ์

Base