2012-04-13 7 views
12

Tôi nhận được lỗi sau trong C++:lỗi C2614: 'ChildClass': bất hợp pháp thành viên khởi: 'var1' không phải là một cơ sở hoặc thành viên

lỗi C2614: 'ChildClass': bất hợp pháp thành viên khởi tạo: ' var1' là không phải là một cơ sở hoặc thành viên

Class Base 
{ 
    protected: 
    int var1; 
public: 
    Base() 
    { 
     var1=0; 
    } 
} 


class Child : public Base 
{ 
    int chld; 
    public: 
    Child() : var1(0) 
    { 
     chld=1; 
    } 
} 

tôi cảm thấy những gì tôi đã làm là theo giao thức OO. Ở đây var1 là một thành viên dữ liệu của lớp Cơ sở với được bảo vệ làm bộ định danh truy cập. Vì vậy, nó có thể được thừa hưởng và nó sẽ trở thành riêng tư ở trẻ em.

Không hiểu tại sao tôi gặp lỗi?

+2

Bạn cũng có một loạt lỗi trong mã của mình: 'Lớp cơ sở' phải là 'lớp cơ sở'. Bạn đang thiếu dấu chấm phẩy sau mỗi lớp. – Mysticial

+0

Tại sao bạn nghĩ rằng "nó sẽ trở thành riêng tư ở trẻ em"? –

Trả lời

20

Nó không hoạt động vì lý do chính xác mà thông báo lỗi cung cấp cho bạn: bạn chỉ có thể sử dụng danh sách khởi tạo với các thành viên trực tiếp hoặc các lớp cơ sở.

Trong trường hợp của bạn, bạn thậm chí không cần phải khởi tạo var1, vì Base::Base() sẽ được gọi bởi Child của nhà xây dựng, trong đó sẽ thiết lập var1-0.

Nếu bạn muốn có một giá trị khác nhau, bạn sẽ phải quá tải Base constructor và gọi nó một cách rõ ràng:

class Base 
{ 
protected: 
    int var1; 
public: 
    Base() : var1(0) 
    { 
    } 
    Base(int x) : var1(x) 
    { 
    } 
}; 

class Child:public Base 
{ 
    int chld; 
public: 
    Child(): Base(42) , chld(1) 
    { 
    } 
}; 
+1

Quá tải 'Base (int x)' có thể cần phải được 'bảo vệ'. – ildjarn

5

Bạn không thể khởi tạo một thành viên của một lớp cơ sở, duy nhất của lớp hiện hành. Sử dụng một hàm tạo tham số trong lớp cơ sở.

Class Base 
{ 
    protected: 
    int var1; 
    Base(int var) : var1(var) 
    {} 
    public: 
    Base() 
    { 
     var1=0; 
    } 
}; 

class Child:public Base 
{ 
     int chld; 
    public: 
     Child():Base(0) 
     { 
     chld=1; 
     } 
}; 
+0

cảm ơn bạn rất nhiều :) – codeLover