class A {
int i;
public:
A() {cout<<"in A's def const\n";};
A(int k) {cout<<"In A const\n"; i = k; }
};
class B : virtual public A {
public:
B(){cout<<"in B's def const\n";};
B(int i) : A(i) {cout<<"in B const\n";}
};
class C : public B {
public:
C() {cout<<"in C def cstr\n";}
C(int i) : B(i) {cout<<"in C const\n";}
};
int main()
{
C c(2);
return 0;
}
Sản lượng trong trường hợp này làTrình tự gọi constructor trong thừa kế ảo
in A's def const
in B const
in C const
Tại sao điều này không đi vào in A const
'Nó nên làm theo thứ tự của 1 arg gọi constructor. Nhưng những gì thực sự đang xảy ra trên bắt nguồn B từ A bằng cách sử dụng từ khóa ảo.
Có vài câu hỏi nữa
Thậm chí nếu tôi loại bỏ các từ khóa ảo trong chương trình ở trên và loại bỏ tất cả các nhà xây dựng mặc định nó mang lại cho lỗi. Vì vậy, tại sao nó cần các nhà xây dựng def
@james .... bạn muốn nói rằng lớp dẫn xuất nhất ở đây nghĩa là C nên chỉ định trình khởi tạo cho A. Nhưng, khi xóa một hàm tạo mặc định và thêm C (int i): A (i), B (i) trong C của constructor nó không làm việc – Kunal
@MikeDeSimone ... ya tôi đã viết cùng nhưng loại bỏ constructor mặc định của A nhưng tôi nhận được lỗi biên dịch ... bạn có thể vui lòng giải thích tại sao điều này là như vậy ... và làm thế nào để chăm sóc nếu tôi có một thừa kế phức tạp liên quan đến. – Kunal
@Kunal: Vâng, tôi đã xóa nhận xét của tôi vì bạn thực sự đã thử nó. Vì vậy, ở đây chúng tôi có một câu trả lời, bỏ phiếu, không hoạt động. @ James, vui lòng giải thích cách sửa mã để hàm tạo 'A (int)' được gọi. –