Như đã được một số người trả lời, bạn không thể trì hoãn việc triệu gọi một hàm tạo lớp cơ sở, nhưng Konrad has given a good answer có thể giải quyết tốt vấn đề của bạn. Tuy nhiên, điều này có nhược điểm của nó (ví dụ, khi bạn cần khởi tạo một số hàm với các giá trị có tính toán chia sẻ kết quả trung gian), do đó, để hoàn thành, đây là một cách khác để giải quyết vấn đề thứ tự khởi tạo cố định, sử dụng .
Cho thứ tự cố định khởi tạo, nếu bạn có quyền kiểm soát lớp dẫn xuất (và bạn sẽ làm thế nào để fiddle với một trong các ctors của nó?), Bạn có thể lẻn vào một cơ sở tư nhân để nó sẽ được khởi tạo trước khi cơ sở khác, mà sau đó có thể được khởi tạo với giá trị đã tính toán cơ sở tư nhân:
class my_dirty_little_secret {
// friend class the_class;
public:
my_dirty_little_secret(const std::string& str)
{
// however that calculates x, y, and z from str I wouldn't know
}
int x;
std::string y;
float z;
};
class the_class : private my_dirty_little_secret // must be first, see ctor
, public the_other_base_class {
public:
the_class(const std::string str)
: my_dirty_little_secret(str)
, the_other_base_class(x, y, z)
{
}
// ...
};
Lớp my_dirty_little_secret
là một cơ sở riêng để người dùng của the_class
không thể sử dụng nó, tất cả nội dung của nó cũng là riêng tư, với tình bạn rõ ràng chỉ cấp quyền truy cập the_class
. Tuy nhiên, vì nó được liệt kê đầu tiên trong danh sách lớp cơ sở, nó sẽ được xây dựng một cách đáng tin cậy trước the_other_base_class
, vì vậy bất cứ điều gì nó tính toán có thể được sử dụng để khởi tạo điều đó.
Một bình luận tốt đẹp trong danh sách lớp cơ sở hy vọng ngăn chặn những người khác phá vỡ mọi thứ bằng cách tái cấu trúc.
Cảm ơn, đã không nghĩ đến việc chỉ gọi một hàm, do đó nó sẽ hoạt động nhưng sẽ hơi lộn xộn vì hàm tạo có 2 tham số. Tôi sẽ chấp nhận câu trả lời này khi tôi có thể (trừ khi có một câu trả lời tốt hơn, dĩ nhiên). BTW, bạn nói đúng về việc không thể làm điều này trong Java và C#, tôi nghĩ nó có thể trong Java bởi vì nó được thực hiện bằng cách sử dụng 'super (...)' trên thân phương thức, nhưng bây giờ tôi đã nhận thấy nó phải là dòng đầu tiên. – placeholder
+1 Bạn nên thực hiện some_function() tĩnh để ghi lại thực tế là nó không sử dụng bất kỳ biến cá thể nào của lớp (chưa được khởi tạo). –
Thú vị, chưa bao giờ thấy điều đó được thực hiện trước đây. Tôi cho rằng hàm được gọi có thể là hàm lớp dẫn xuất. – PatrickV