2012-04-16 23 views
5

Hãy xem xét một lớp Waldo, được thừa kế từ Foo và Baz, tức .:Tính năng này có hoạt động không? C++ đa kế thừa và constructor chaining

class Waldo : public Foo, public Baz { 
    ... 
}; 

Khi tôi tạo ra một thể hiện mới của Waldo:

Waldo *w = new Waldo; 

làm Foo và Baz xây dựng được gọi là? Nếu chúng không được gọi theo mặc định, có cách nào dễ dàng trong KHAI THÁC LỚP HOẶC TRONG KẾT HỢP/ĐỊNH NGH ofA của nhà xây dựng Waldo để buộc chúng được gọi?

(Dường như tôi có thể cố gắng làm constructor chaining, và C++ bị cáo buộc không làm điều đó. Tôi không chắc chắn.)

Những gì tôi đang cố gắng làm là "chú thích" lớp khác nhau các khai báo, nơi các chú thích gây ra (trong số những thứ khác) các cá thể của lớp được chú thích được liên kết vào các danh sách được duy trì bởi các lớp chú thích. Điều này cho phép tôi, ví dụ, đi bộ danh sách của tất cả các đối tượng với Baz-nature, áp dụng một hoạt động nhất định cho họ, và không phải lo lắng về việc liệu tôi có nhớ thêm cá thể vào danh sách các đối tượng với Baz-nature hay không, vì constructor đã làm nó automagically.

+1

Lưu ý: việc sử dụng 'mới' ở đây là giả mạo, bạn hoàn toàn có thể nói 'Waldo w;' và một thể hiện 'Waldo' sẽ được tạo. –

Trả lời

1

Các hàm tạo của tất cả các thành viên của một lớp được gọi theo thứ tự chúng được khai báo trong lớp.

Các hàm tạo mặc định của các lớp dẫn xuất gọi hàm tạo của lớp cơ sở theo mặc định. Nếu họ cần đối số, họ cần phải được gọi rõ ràng khác đó là lỗi ...

class Employee { 
private: 
    // 
public: 
    Employee(); 
    //... 
}; 



class Manager: public Employee { 
private: 
    short level; 
public: 
    Manager(): Employee(), level() {} // This is the default constructor, it calls Employee(). 
    // The definition is equivalent to default constructor of Manager.. 
    //... 
    }; 
+0

Câu trả lời và giải thích chi tiết, tốt. Cảm ơn bạn! –

7

Có, chúng được gọi. Trái sang phải.

Các vấn đề liên quan