2012-11-27 43 views
6

Tôi có một biến int liên tục trong lớp cơ sở của mình, và tôi muốn khởi tạo đáp ứng một trong lớp dẫn xuất của tôi, với giá trị khác nhau (được lấy làm tham số), điều này có khả thi không?C++ Khởi tạo lớp cơ sở 'const int trong lớp dẫn xuất?

Dưới đây là những gì tôi đã làm:

// Base.h (methods implemented in Base.cpp in the actual code) 
class Base { 
    public: 
     Base(const int index) : m_index(index) {} 
     int getIndex() const { return m_index; } 
    private: 
     const int m_index; 
}; 

// Derived.h 
class Derived : public Base { 
    public: 
     Derived(const int index, const std::string name) : m_name(name) {} 
     void setName(const std::string name) { m_name = name; } 
     std::string getName() const { return m_name; } 
    private: 
     std::string m_name; 
}; 

Nhưng rõ ràng là nó hỏi tôi cho Base::Base() đó không tồn tại, và nếu tôi xác định nó, tôi sẽ phải từ bỏ giá trị mặc định cho m_index, mà tôi không muốn làm. Tôi có phải xác định riêng biệt từng lớp học có nguồn gốc từ const int m_index không?

câu hỏi tương tự, nhưng tôi không chắc chắn nếu tĩnh ảnh hưởng này dưới mọi hình thức: C++ : Initializing base class constant static variable with different value in derived class?

Trả lời

13

Đơn giản chỉ cần gọi Base constructor thích hợp trong danh sách khởi tạo 's Derived:

Derived(const int index, const std::string name) : Base(index), m_name(name) {} 
+1

GÌ?!? Tôi đã làm C++ cho 3 đến 4 năm hoặc một cái gì đó, và tôi đã không bao giờ chạy vào điều này? Tôi đã luôn luôn nghĩ rằng tôi phải sử dụng constructor mặc định ... Cảm ơn dude, gonna chấp nhận trong một phút. –

1

Bạn có thể gọi hàm tạo cơ sở như sau:

class B1 { 
    int b; 
public:  
    // inline constructor 
    B1(int i) : b(i) {} 
}; 

class B2 { 
    int b; 
protected: 
    B2() {}  
    // noninline constructor 
    B2(int i); 
}; 

class D : public B1, public B2 { 
    int d1, d2; 
public: 
    D(int i, int j) : B1(i+1), B2(), d1(i) 
    { 
    d2 = j; 
    } 
}; 

Vì c + +11 thậm chí bạn có thể sử dụng các hàm tạo của cùng một lớp. Tính năng này được gọi là các nhà thầu ủy nhiệm.

Derived(){} 
Derived(const int index, const std::string name) : Derived() {} 
Các vấn đề liên quan