2016-08-24 18 views
5

Với hai lớp với một lớp cơ sở ảo chung:C++ ảo thừa kế khác biệt

class Base {}; 

class Derived1 : public virtual Base {}; 

class Derived2 : public virtual Base {}; 

Có sự khác biệt giữa hai lớp có nguồn gốc xa hơn ?:

  • class Derived3 : public virtual Base, public Derived1, public Derived2 {}; 
    
  • class Derived3 : public Derived1, public Derived2 {}; 
    

Đầu tiên cũng xuất phát trực tiếp từ cơ sở ảo c lass, nhưng tôi nghĩ rằng nó không có hiệu lực, bởi vì nó được chia sẻ với Derived1Derived2.

Trả lời

2

Họ nói điều tương tự. Điểm khác biệt duy nhất là nếu bạn đã xóa public Derived1public Derived2 khỏi cả hai định nghĩa của Derived3, giá trị đầu tiên vẫn sẽ kế thừa từ Base và giá trị thứ hai sẽ không.

EDIT: Tôi đã không suy nghĩ cẩn thận về việc có một số tình huống cross-cast lạ mà hai người cũng sẽ hành xử khác nhau, mặc dù tôi không nghĩ là có.

2

Không có sự khác biệt giữa các ví dụ đó.

Nhưng trong một kịch bản phức tạp hơn, việc kế thừa trực tiếp một cơ sở ảo được kế thừa khác có thể thay đổi thứ tự xây dựng/hủy bỏ các lớp con cơ sở.

1

Tôi không nghĩ có bất kỳ sự khác biệt nào về bố cục đối tượng vì mục đích thừa kế ảo là tránh có hai bản sao Base (hoặc ba bản sao trong trường hợp 1).

Vì vậy, tất cả sự khác biệt là ý định của bạn và khả năng đọc mã thực sự.