Tôi có một lớp cơ sở khai báo và định nghĩa một constructor, nhưng đối với một số lý do của tôi công khai nguồn gốc lớp không nhìn thấy constructor đó, và do đó tôi phải khai báo rõ ràng một constructor chuyển tiếp trong lớp có nguồn gốc:Tại sao lớp con C++ của tôi cần một hàm tạo rõ ràng?
class WireCount0 {
protected:
int m;
public:
WireCount0(const int& rhs) { m = rhs; }
};
class WireCount1 : public WireCount0 {};
class WireCount2 : public WireCount0 {
public:
WireCount2(const int& rhs) : WireCount0(rhs) {}
};
int dummy(int argc, char* argv[]) {
WireCount0 wireCount0(100);
WireCount1 wireCount1(100);
WireCount2 wireCount2(100);
return 0;
}
Trong đoạn mã trên, khai báo WireCount1 wireCount1(100)
của tôi bị từ chối bởi trình biên dịch ("Không có hàm phù hợp cho cuộc gọi đến" WireCount1 :: WireCount1 (int) '"), trong khi các khai báo wireCount0
và wireCount2
của chúng tôi là tốt.
Tôi không chắc chắn rằng tôi hiểu tại sao tôi cần phải cung cấp hàm tạo rõ ràng được hiển thị trong WireCount2
. Có phải vì trình biên dịch tạo ra một hàm tạo mặc định cho WireCount1
và hàm tạo đó ẩn trình xây dựng WireCount0
?
Để tham khảo, trình biên dịch là i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
.
Tôi nghĩ bạn đã hiểu sai câu hỏi của mình. Anh ta không hỏi tại sao anh ta không thể gọi constructor mặc định của Class1, nhưng đúng hơn là tại sao không có constructor Class1 (int) nào để gọi. – Shirik
Trình biên dịch vẫn tạo ra một hàm tạo 'Class1()' trong ví dụ cuối cùng của bạn. Nó chỉ là constructor này là ill-hình thành nếu nó thực sự được xác định (theo mặc định như cho tất cả các chức năng đặc biệt, nó chỉ tuyên bố cho đến khi nó thực sự được sử dụng).Bạn có thể xác minh điều này bằng cách làm cho nó trở thành một người bạn: 'class Class2 {friend Class1 :: Class1(); }; ', hoạt động vì trình biên dịch ngầm khai báo constructor mặc định cho dù nó có thực sự được gọi hay không. –
Cảm ơn. Điều đó làm cho nó rất rõ ràng với tôi. Mặc dù tôi đánh giá cao phản ứng của Shirik, tôi tin rằng ví dụ của bạn cho thấy chính xác những gì đang xảy ra trong mã của tôi. –