2013-06-26 34 views
17

Tôi đang cố gắng hiểu ảnh hưởng của thứ tự kế thừa trong C++ .. Tôi đã xem trực tuyến, nhưng tôi không thể tìm thấy câu trả lời rõ ràng và đầy đủ ...C++ nhiều thứ tự thừa kế

Vì vậy, vì lợi ích của câu hỏi, giả sử có 2 lớp: lớp B và lớp C.

Bây giờ, định nghĩa:

class A1 : public B, public C{ ... }; 
class A2 : public C, public B{ ... }; 

sự khác biệt giữa A1 và A2 là bao nhiêu?

Cảm ơn rất nhiều!

+0

Câu hỏi xen kẽ. Tôi muốn biết câu trả lời. Tôi đã tìm thấy liên kết này - http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr134.htm, tuyên bố, " Thứ tự của đạo hàm chỉ có liên quan để xác định thứ tự khởi tạo mặc định bởi các hàm tạo và dọn sạch bởi các trình phá hủy. " Có lẽ ai đó có thể xác nhận điều này? – OldProgrammer

Trả lời

11

Thứ tự của phái sinh chỉ liên quan để xác định thứ tự khởi tạo mặc định bởi các hàm tạo và dọn sạch bởi các trình phá hủy.

Thứ tự xuất phát không đáng kể trừ khi được chỉ định bởi ngữ nghĩa khởi tạo bởi hàm tạo (12.6.2), dọn dẹp (12.4) và bố cục lưu trữ (9.2, 11.1). - cuối note]"(§10.1/2)

Từ ++ tài liệu C của IBM: Multiple inheritance

+1

Câu trả lời của bạn sẽ tốt hơn nếu bạn đặt báo giá trực tiếp thay vì có liên kết. –

+1

Trích dẫn có trực tiếp không? Hay tôi đang thiếu một cái gì đó? – Haagenti

+0

Đúng, nhưng các liên kết thô có liên quan:/ –

7

C++ 11 Tiêu chuẩn nói (§10.1):

Trình tự nguồn gốc là không đáng kể, ngoại trừ theo quy định của ngữ nghĩa của khởi bởi constructor (12.6.2), dọn dẹp (12,4), và lưu trữ bố trí (9.2, 11.1).

Ba đoạn được tham chiếu cho thấy rằng

  • Các trình xây dựng được gọi theo thứ tự bạn viết ra (lớp cơ sở đầu tiên trong danh sách được xây dựng trước) (§12.6.2.10). Các quy tắc khác nhau áp dụng cho các lớp cơ sở ảo luôn được xây dựng từ lớp có nguồn gốc cao nhất trước bất kỳ lớp cơ sở trực tiếp nào.
  • Các cấu trúc được gọi theo thứ tự xây dựng ngược (lớp cơ sở đầu tiên trong danh sách bị hủy cuối cùng)
  • Bố cục lưu trữ không được chỉ định. Bạn không được đưa ra bất kỳ giả định nào về bố cục lớp trong bộ nhớ. Ngoại lệ duy nhất được gọi là bố cục tiêu chuẩn lớp (§9), về cơ bản là cấu trúc kiểu C. Nhưng vì chúng không được phép có nhiều hơn một lớp với các thành viên không tĩnh trong phân cấp lớp, câu hỏi không thực sự áp dụng ở đây.

Lưu ý rằng bố cục bộ nhớ có thể quan trọng. Ví dụ, nếu một thư viện bên ngoài làm cho các phôi kiểu C ngây thơ giả định rằng phần của đối tượng mà nó quan tâm là lúc đầu, nó có thể dẫn đến các lỗi thời gian chạy khó gỡ lỗi.

+3

Tôi không "cân nhắc" bất cứ điều gì. "thực hiện xác định" được định nghĩa trong tiêu chuẩn ANSI C89, và định nghĩa tương tự được sử dụng trong C++. Chỉ những thứ mà tiêu chuẩn mô tả là "triển khai được xác định" được coi là "triển khai được xác định": ** nếu một cái gì đó là "triển khai được xác định", thì việc thực hiện được yêu cầu để ghi lại tài liệu **. Việc thực hiện tất nhiên được cho phép cũng tài liệu bất cứ điều gì nó muốn. Nó có thể mô tả thứ tự đánh giá của 'toán tử +' đối số, nhưng điều đó không bắt buộc. Nó có thể ghi lại bố trí của vtable, nhưng điều đó không bắt buộc. – curiousguy

+0

"_it là trách nhiệm của thực hiện để xác định layout_" việc thực hiện cũng phải chọn một thứ tự đánh giá trong hai khả năng mỗi khi bạn viết 'f (g(), h())', nhưng cách chọn nó hiếm khi mô tả. Việc triển khai chịu trách nhiệm cho nhiều thứ không được ghi lại, ngoại trừ trong mã nguồn. – curiousguy

+0

@curiousguy Đó là chính xác những gì câu trả lời đã được cố gắng để thể hiện: _You không được thực hiện bất kỳ giả định về class_ class_. Thuật ngữ _implementation-defined_ ở đây chịu các ý nghĩa hơi khác nhau trong ISO-nói và trong lời nói thông tục (đó là trường hợp cho nhiều thuật ngữ được sử dụng trong tiêu chuẩn). Để tránh sự nhầm lẫn này, tôi đã thay đổi từ ngữ của câu trả lời. Chúng tôi có thể thực hiện việc này trong ít bài đăng hơn nhiều nếu bài đăng gốc của bạn đã chứa thông tin từ bài đăng thứ hai của bạn. Cảm ơn vì đã ở bên tôi. – ComicSansMS