2011-08-29 35 views
34

thể trùng lặp:
C++ static virtual members?Chúng ta có thể có một phương pháp tĩnh ảo không? (C++)

Chúng ta có thể có một phương pháp tĩnh ảo (trong C++)? Tôi đã cố gắng để biên dịch mã sau:

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    virtual static void f() {cout << "A's static method" << endl;} 
}; 

class B :public A 
{ 
public: 
    static void f() {cout << "B's static method" << endl;} 
}; 

int main() 
{ 
    /* some code */ 
    return 0; 
} 

nhưng trình biên dịch nói rằng:

member 'f' cannot be declared both virtual and static 

vì vậy tôi đoán câu trả lời là không, nhưng tại sao?

cảm ơn, Ron

Trả lời

47

số static trên một hàm trong một lớp học có nghĩa là chức năng không cần một đối tượng hoạt động trên. virtual nghĩa là việc triển khai phụ thuộc vào loại đối tượng gọi. Đối với tĩnh không có đối tượng gọi, do đó không có nghĩa là có cả hai số staticvirtual trên cùng một chức năng .

2

Do lớp không có con trỏ this. Trong đó có bảng tra cứu chức năng ảo. Một google nhanh có thể cho bạn biết thêm về bảng tra cứu chức năng ảo.

4

Đừng nghĩ rằng điều này là có thể vì bạn có thể gọi A::F(); mà không cần đối tượng A. Làm cho nó ảo và tĩnh có nghĩa là mâu thuẫn.

+3

Aha, sau đó tĩnh có nghĩa là * điều này không tồn tại, ảo nghĩa là phương thức có con trỏ này. Sự kết hợp của hai làm cho một mâu thuẫn. Nice :) cảm ơn –

1

Không, chức năng static giống như chức năng toàn cầu, mà còn bên trong không gian tên lớp. virtual ngụ ý thừa kế và reimplementing trong lớp dẫn xuất - bạn không thể reimplement 'toàn cầu' chức năng.

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