การเขียนผิด:
class A {
public:
virtual ~A() = 0;
};
สำหรับคลาสฐานที่เป็นนามธรรม?
อย่างน้อยก็คอมไพล์ใน MSVC ... มันจะพังในเวลาทำงานหรือไม่
การเขียนผิด:
class A {
public:
virtual ~A() = 0;
};
สำหรับคลาสฐานที่เป็นนามธรรม?
อย่างน้อยก็คอมไพล์ใน MSVC ... มันจะพังในเวลาทำงานหรือไม่
คำตอบ:
ใช่. นอกจากนี้คุณยังต้องติดตั้ง destructor ด้วย:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
ควรจะพอเพียง
และเนื่องจากสิ่งนี้ได้รับการโหวตฉันควรชี้แจงว่า: หากคุณได้รับสิ่งใดจาก A และจากนั้นลองลบหรือทำลายมันA
ในที่สุดผู้ทำลายของมันก็จะถูกเรียก เนื่องจากเป็นสิ่งที่บริสุทธิ์และไม่มีการนำไปใช้พฤติกรรมที่ไม่ได้กำหนดจะเกิดขึ้น บนแพลตฟอร์มยอดนิยมเดียวที่จะเรียกใช้ตัวจัดการบริสุทธิ์และความผิดพลาด
แก้ไข: แก้ไขการประกาศเพื่อให้สอดคล้องกันมากขึ้นรวบรวมด้วยhttp://www.comeaucomputing.com/tryitout/
destructors ส่วนตัว: พวกเขาจะให้ข้อผิดพลาดเมื่อคุณสร้างวัตถุของคลาสที่ได้รับไม่ใช่อย่างอื่น การวินิจฉัยอาจปรากฏขึ้น
12.4 Destructors
6 destructor สามารถประกาศเสมือน (10.3) หรือ pure virtual (10.4); ถ้าวัตถุใด ๆ ของคลาสนั้นหรือคลาสที่ได้รับมาถูกสร้างขึ้นในโปรแกรมตัวทำลายจะถูกกำหนด
คลาสที่มี destructor เสมือนแท้เป็นคลาสนามธรรม หมายเหตุดี:
10.4 คลาสนามธรรม
2 จำเป็นต้องกำหนดฟังก์ชั่นเสมือนจริงเฉพาะเมื่อถูกเรียกด้วย, หรือราวกับว่า (12.4), ไวยากรณ์ -ID ที่ผ่านการรับรอง (5.1)
[ หมายเหตุ : การประกาศฟังก์ชันไม่สามารถให้ทั้งตัวระบุบริสุทธิ์และคำจำกัดความ - บันทึกย่อ]
ตรงจากร่าง:
struct C {
virtual void f() = 0 { }; // ill-formed
};