destructor เสมือนแท้ใน C ++


163

การเขียนผิด:

class A {
public:
    virtual ~A() = 0;
};

สำหรับคลาสฐานที่เป็นนามธรรม?

อย่างน้อยก็คอมไพล์ใน MSVC ... มันจะพังในเวลาทำงานหรือไม่


9
มันอาจจะรวบรวม แต่มันเชื่อมโยง?
Mooing Duck

คำตอบ:


218

ใช่. นอกจากนี้คุณยังต้องติดตั้ง destructor ด้วย:

class A {
public:
    virtual ~A() = 0;
};

inline A::~A() { }

ควรจะพอเพียง

และเนื่องจากสิ่งนี้ได้รับการโหวตฉันควรชี้แจงว่า: หากคุณได้รับสิ่งใดจาก A และจากนั้นลองลบหรือทำลายมันAในที่สุดผู้ทำลายของมันก็จะถูกเรียก เนื่องจากเป็นสิ่งที่บริสุทธิ์และไม่มีการนำไปใช้พฤติกรรมที่ไม่ได้กำหนดจะเกิดขึ้น บนแพลตฟอร์มยอดนิยมเดียวที่จะเรียกใช้ตัวจัดการบริสุทธิ์และความผิดพลาด

แก้ไข: แก้ไขการประกาศเพื่อให้สอดคล้องกันมากขึ้นรวบรวมด้วยhttp://www.comeaucomputing.com/tryitout/


16
อืมใช่มันเป็น เพียวเท่านั้นหมายถึงคลาสที่ได้รับยังต้องจัดเตรียมการใช้งาน
MSN

72
การใช้งานฟังก์ชั่นเสมือนล้วนเป็นความจริงตามกฎหมาย มีประโยชน์มากสำหรับการนำเสนอการใช้งานเริ่มต้น แต่บังคับให้คลาสย่อยเรียกมันอย่างชัดเจน
jmucchiello

6
MSN และหมายเหตุถ้าคุณมีความหมายในส่วนหัวที่คุณจะต้องใส่ "อินไลน์" ก่อนที่มันจะหลีกเลี่ยงการละเมิด ODR (หนึ่งกฎนิยาม)
โยฮันเน Schaub - litb

2
เหตุใด A :: ~ A () จะต้องมีการกำหนดไว้อย่างชัดเจนเนื่องจากฉันคิดว่ามี destructor เริ่มต้นสำหรับทุกวัตถุ เช่นเดียวกับการสืบทอดประเภทใด ๆ โซ่แห่ง destructors จะถูกเรียกเสมอและตัวทำลายคลาสพื้นฐานไม่จำเป็นต้องกำหนดเสมอ
jeffD

11
วิธีที่ดีกว่าที่จะกล่าวคือเมื่อคุณประกาศผู้ทำลายสิ่งนั้นมันจะไม่ถูกนำมาใช้โดยอัตโนมัติสำหรับคุณ
MSN

49

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
};

14
+1 ผมคิดว่า Sutter สมุนไพรนอกจากนี้ยังมีข้อมูลที่ดีบางอย่างเกี่ยวกับเรื่องนี้: gotw.ca/gotw/031.htm เป็นที่น่าสนใจที่จะทราบว่าฟังก์ชั่นเสมือนใด ๆ ที่บริสุทธิ์อาจมีการใช้งานที่จัดเตรียมไว้ให้ไม่ใช่แค่ destructors
Fred Larson

6
ใช่มันเป็นสิ่งที่คุณทำในการสัมภาษณ์เพื่อทำให้ประหลาดผู้สัมภาษณ์ของคุณ;)
dirkgently

1
ในความเป็นจริงแล้วมันไม่ใช่เรื่องแปลกอะไรเลยในประสบการณ์ของฉัน

@ Neil Butterworth: อันไหน?
dirkgently

@Dirk - สถานการณ์ "any function" ไม่ใช่เรื่องแปลกที่จะพบว่ามันใช้ในการใช้พฤติกรรมทั่วไปบางอย่าง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.