คำถามติดแท็ก diamond-problem

16
Java หลายมรดก
ในความพยายามที่จะเข้าใจวิธีแก้ปัญหาการสืบทอดหลายอย่างของ Java อย่างสมบูรณ์ฉันมีคำถามแบบคลาสสิกที่ฉันต้องการชี้แจง ให้บอกว่าฉันมีคลาสAnimalนี้มีคลาสย่อยBirdและHorseและฉันจำเป็นต้องทำคลาสPegasusที่ขยายจากBirdและHorseเนื่องจากPegasusเป็นทั้งนกและม้า ฉันคิดว่านี่เป็นปัญหาเพชรแบบดั้งเดิม จากสิ่งที่ฉันสามารถเข้าใจวิธีที่คลาสสิกที่จะแก้ปัญหานี้คือการทำให้Animal, BirdและHorseการเชื่อมต่อการเรียนและการดำเนินการPegasusจากพวกเขา ฉันสงสัยว่ามีวิธีอื่นในการแก้ปัญหาที่ฉันยังสามารถสร้างวัตถุสำหรับนกและม้าได้หรือไม่ หากมีวิธีที่จะสามารถสร้างสัตว์ก็จะดี แต่ไม่จำเป็น

5
การสืบทอดเสมือนช่วยแก้ความคลุมเครือของ "เพชร" (มรดกหลายรายการ) ได้อย่างไร
class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } ฉันเข้าใจปัญหาเพชรและส่วนข้างบนของรหัสไม่มีปัญหานั้น …

2
ทำ Derived1 :: ฐานและ Derived2 :: ฐานอ้างถึงชนิดเดียวกันหรือไม่
MSVC, Clang และ GCC ไม่เห็นด้วยกับรหัสนี้: struct Base { int x; }; struct Der1 : public Base {}; struct Der2 : public Base {}; struct AllDer : public Der1, public Der2 { void foo() { Der1::Base::x = 5; } }; Godbolt GCC: <source>: In member function 'void AllDer::foo()': <source>:10:21: error: 'Base' …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.