2013-06-29 33 views
7

Cho phép nhìn vào đoạn mã sau:ảo baseclass gọi constructor rỗng trong C++ (C++ 11)

class A{ 
protected: 
    int _val; 
public: 
    A(){printf("calling A empty constructor\n");} 
    A(int val):_val(val){printf("calling A constructor (%d)\n", val);} 
}; 

class B: virtual public A{ 
public: 
    B(){printf("calling B empty constructor\n");} 
    B(int val):A(val){printf("calling B constructor (%d)\n", val);} 
}; 

class C: public B{ 
public: 
    C(){printf("calling C empty constructor\n");} 
    C(int val):B(val){printf("calling C constructor (%d)\n", val);} 
}; 

int main(void) { 
    C test(2); 
} 

Đầu ra là:

calling A empty constructor 
calling B constructor (2) 
calling C constructor (2) 

ai đó có thể giải thích cho tôi tại sao Một lớp học constructor được gọi mà không có bất kỳ đối số nào? Làm cách nào để tôi có thể "sửa" hành vi này nếu tôi muốn lớp B kế thừa hầu như từ A? (Nếu thừa kế không phải là ảo - mẫu hoạt động tốt)

+0

thể trùng lặp của [Trình tự gọi constructor trong thừa kế ảo] (http://stackoverflow.com/questions/10534228/order-of-constructor-call-in-virtual-inheritance) –

+1

Có không này được thảo luận cho đến chết? –

+0

từ khóa 'virtual' trong thừa kế luôn làm cho hàm tạo gọi hàm khởi tạo mặc định của lớp cơ sở ngay cả khi bạn đã chỉ định một hàm tạo không mặc định trong khai báo, dựa trên suy luận rằng lớp cơ sở sẽ hiển thị nhiều lần trong cây thừa kế và bạn chỉ muốn hàm tạo được gọi một lần. Cũng lưu ý rằng hàm tạo mặc định từ thừa kế ảo được gọi trước đó từ thừa kế thông thường bất kể thứ tự bạn đã chỉ định. – Immueggpain

Trả lời

10

Trong C++ 03 nó sẽ giống nhau.

Trình tạo cơ sở ảo luôn được gọi từ lớp lá cuối cùng. Nếu bạn muốn một cái gì đó khác hơn là constructor mặc định cho A khi instantiating một C, bạn phải xác định nó trong constructor của lớp C quá.

C(int val): A(val), B(val) {printf("calling C constructor (%d)\n", val);} 
Các vấn đề liên quan