มาตรฐาน ISO C ++ ระบุว่าต้องกำหนดเมธอดเสมือนทั้งหมดของคลาสที่ไม่ใช่เพียว - เวอร์ชวล
เพียงแค่ใส่กฎคือ:
หากคลาสที่ได้รับของคุณทับเมธอดเสมือนคลาสฐานแล้วก็ควรให้คำจำกัดความด้วยเช่นกันถ้าไม่เช่นนั้นคลาสฐานควรให้คำจำกัดความของเมธอดนั้น
ตามกฎข้างต้นในตัวอย่างโค้ดของคุณvirtual void bar();
ต้องการคำจำกัดความในคลาสฐาน
อ้างอิง:
C ++ 03 Standard: 10.3 ฟังก์ชันเสมือน [class.virtual]
ฟังก์ชันเสมือนที่ประกาศในคลาสจะต้องถูกกำหนดหรือประกาศว่าบริสุทธิ์ (10.4) ในคลาสนั้นหรือทั้งสองอย่าง แต่ไม่จำเป็นต้องมีการวินิจฉัย (3.2)
ดังนั้นคุณควรทำให้ฟังก์ชันเสมือนจริงบริสุทธิ์หรือให้คำจำกัดความสำหรับมัน
GCC คำถามที่พบบ่อย doccuments มันเช่นกัน:
มาตรฐาน ISO C ++ ระบุว่าต้องกำหนดเมธอดเสมือนทั้งหมดของคลาสที่ไม่ใช่เพียว - เวอร์ช่วล แต่ไม่ต้องการการวินิจฉัยใด ๆ สำหรับการละเมิดกฎ[class.virtual]/8
นี้ จากสมมติฐานนี้ GCC จะปล่อยเฉพาะตัวสร้างที่กำหนดโดยนัยตัวดำเนินการกำหนดตัวทำลายและตารางเสมือนของคลาสในหน่วยการแปลที่กำหนดวิธีการที่ไม่ใช่อินไลน์เป็นครั้งแรก
ดังนั้นหากคุณไม่สามารถกำหนดวิธีการนี้โดยเฉพาะผู้เชื่อมโยงอาจบ่นเกี่ยวกับการขาดคำจำกัดความสำหรับสัญลักษณ์ที่ไม่เกี่ยวข้องอย่างเห็นได้ชัด ขออภัยในการปรับปรุงข้อความแสดงข้อผิดพลาดนี้อาจจำเป็นต้องเปลี่ยนตัวเชื่อมโยงและไม่สามารถทำได้ตลอดเวลา
วิธีแก้ปัญหาคือเพื่อให้แน่ใจว่ามีการกำหนดวิธีการเสมือนทั้งหมดที่ไม่บริสุทธิ์ โปรดทราบว่าต้องกำหนด destructor แม้ว่าจะประกาศว่าเป็น pure-virtual [class.dtor]/7
ก็ตาม