Chức năng thành viên ảo được khởi tạo khi một mẫu lớp được khởi tạo, nhưng các chức năng thành viên không phải ảo được khởi tạo chỉ khi chúng được gọi.
Điều này được đề cập trong [temp.inst] trong tiêu chuẩn C++ (Trong C++ 11, đây là §14.7.1/10. Trong C++ 14, nó là §14.7.1/11 và trong C++ 17 nó là §17.7.1/9. Trích từ C++ 17 dưới đây)
An thực hiện sẽ không ngầm nhanh chóng một hàm mẫu, một mẫu biến, một mẫu thành viên , một tổ chức phi ảo chức năng thành viên, một lớp thành viên, một thành viên dữ liệu tĩnh của một mẫu lớp, hoặc một sự thay thế của câu lệnh constexpr
nếu (9.4.1), trừ khi yêu cầu như vậy được yêu cầu
Cũng lưu ý rằng có thể khởi tạo một mẫu lớp ngay cả khi một số hàm thành viên không thể thực hiện được đối với các tham số mẫu đã cho. Ví dụ:
template <class T>
class Xyzzy
{
public:
void CallFoo() { t.foo(); } // Invoke T::foo()
void CallBar() { t.bar(); } // Invoke T::bar()
private:
T t;
};
class FooBar
{
public:
void foo() { ... }
void bar() { ... }
};
class BarOnly
{
public:
void bar() { ... }
};
int main(int argc, const char** argv)
{
Xyzzy<FooBar> foobar; // Xyzzy<FooBar> is instantiated
Xyzzy<BarOnly> baronly; // Xyzzy<BarOnly> is instantiated
foobar.CallFoo(); // Calls FooBar::foo()
foobar.CallBar(); // Calls FooBar::bar()
baronly.CallBar(); // Calls BarOnly::bar()
return 0;
}
Điều này là hợp lệ, mặc dù Xyzzy :: CallFoo() không thể thực hiện được vì không có điều gì như BarOnly :: foo(). Tính năng này được sử dụng thường xuyên như một công cụ lập trình meta mẫu.
Lưu ý, tuy nhiên, "instantiation" của mẫu không tương quan trực tiếp đến số lượng mã đối tượng được tạo. Điều đó sẽ phụ thuộc vào trình biên dịch/trình liên kết của bạn thực hiện.
Nguồn
2008-10-08 14:59:05
Chúng ta cũng nên lưu ý rằng không phải tất cả chức năng đều có thể được khởi tạo và điều này là ok miễn là chúng không được gọi. –
Xong. Tôi nghĩ về điều đó khi ban đầu trả lời, nhưng chỉ là quá lười biếng để viết một lời giải thích đầy đủ. –
Có thể đánh dấu phương thức được khởi tạo nhanh (tức là ngăn không cho nó được tối ưu hóa) mà không làm cho nó trở thành ảo không? Cảm ơn! – Serge