Tôi thấy điều này lạ. Trong ctor của Sample_Base, tôi gọi bar() mà gọi nội bộ fun() là một hàm ảo thuần túy. Tôi nhận được lỗi "hàm ảo thuần túy" được gọi. Mà là tốt. Bây giờ, nếu tôi gọi fun() trực tiếp từ ctor của Sample_Base, tôi không nhận được lỗi đó. Tôi đã thử nó trên VC++ 2010 Beta 2 và trên g ++ 4.4.1 trên Ubuntu 9.10. Tôi đồng ý rằng việc thực hiện một chức năng ảo thuần túy, khác với destructor ảo thuần túy, là vô nghĩa. Nhưng, tôi hơi ngạc nhiên về hành vi này.Chức năng ảo thuần túy được gọi là lỗi
class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/
void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};
Sample_Base::~Sample_Base()
{
}
void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}
class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}
void fun()
{
std::cout << "Sample_Derived::fun\n";
}
~Sample_Derived()
{
}
};
[Tiêu chuẩn C++] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) §10.4.6 nói rằng "một cuộc gọi ảo đến một chức năng ảo thuần túy ... đối với đối tượng đang được tạo ... không xác định ". Bạn có thể bình luận về điều đó? Tôi sẽ đọc nó mà gọi 'fun' trực tiếp cũng nên được undefined (ngay cả khi trình biên dịch không sản xuất một chương trình bị rơi trong trường hợp cụ thể này). Hay không phải là một cuộc gọi ảo trong bối cảnh đó (nếu vậy tại sao, tôi không thể tìm thấy nó trong tiêu chuẩn). – Xlea
@Xlea Charles Bailey chỉ cho bạn các phần phù hợp của tiêu chuẩn trong câu trả lời của mình. Tâm trí bạn, ông đã sử dụng tiêu chuẩn C++ 03 trở lại sau đó, do đó, số phần sẽ khác nhau bây giờ, nhưng điều đó có thể hướng dẫn bạn. – Gorpik