2014-06-10 23 views
6

Do đó tôi có một lớp, và muốn xác định xem nó có hàm ảo hay không.Lớp học có chức năng ảo không? C++

Cách đầu tiên để tôi xem xét bằng tính năng truyền động.

class A 
{ 
// hidden details.. 
}; 

class B:public A{}; 

int main() 
{ 
    A *a = new A;; 
    B* b = dynamic_cast<B*>(a); 
} 

Vì vậy, trong trường hợp này nếu có một hàm ảo trong lớp A, biên dịch sẽ thành công, nếu không, lỗi này sẽ xảy ra:

error: cannot dynamic_cast \u2018a\u2019 (of type \u2018class A*\u2019) to type \u2018class B*\u2019 (source type is not polymorphic)

Có cách nào để kiểm tra này mà không có lỗi biên dịch ? LƯU Ý: Tôi không có C++ 11 hoặc hỗ trợ tăng cường!

+0

Xem ở đây: http://stackoverflow.com/questions/1107948/test-whether-a-class-is-polymorphic std :: is_polymorphic là những gì bạn muốn. – paulm

+4

Xem ['std :: is_polymorphic'] (http://en.cppreference.com/w/cpp/types/is_polymorphic). – juanchopanza

+0

điều này được hỗ trợ vì C++ 11 nếu tôi không nhầm, phải làm gì nếu tôi không nhận được hỗ trợ như vậy? –

Trả lời

8

Bạn có thể kiểm tra sự tồn tại của các phương thức ảo bằng cách so sánh kích thước của loại với kích thước loại với phương thức ảo được thêm vào. Loại kiểm tra này không được đảm bảo bởi tiêu chuẩn và có thể bị lừa bởi thừa kế ảo, vì vậy nó không được sử dụng trong mã sản xuất. Tuy nhiên, nó vẫn có thể hữu ích cho các trường hợp đơn giản trong đó C++ 11 std::is_polymorphic không khả dụng. Thử nghiệm dưới g ++ 4.6:

template<typename T> 
class VirtualTest: private T { 
    virtual void my_secret_virtual(); 
}; 

template<typename T> 
bool has_virtual() { 
    return sizeof(T) == sizeof(VirtualTest<T>); 
} 

Gọi thử nghiệm là has_virtual<A>().

+0

Điều gì xảy ra nếu loại T không có hàm tạo công khai? –

+0

@EduardRostomyan Không có vấn đề gì cả - 'has_virtual ' không bao giờ thực sự cố gắng xây dựng 'T'. – user4815162342

+0

Bạn có thể giải thích tại sao nó không được xây dựng? –

Các vấn đề liên quan