2012-04-02 35 views
20

Tôi có một lời tuyên bố trong một cpp nơi một chức năng giống như:Sự khác biệt giữa khoảng trống ảo funcFoo() const = 0 và void ảo funcFoo() = 0;

virtual void funcFoo() const = 0; 

tôi cho rằng có thể được thừa hưởng bởi lớp khác nếu được khai báo rõ ràng, nhưng sự khác biệt giữa

virtual void funcFoo() = 0; 

là quan trọng là những gì để tôi cải thiện chương trình của mình và tôi muốn biết sự khác biệt. Tôi không muốn một sự cố gây ra bởi một kế thừa xấu.

Xin cảm ơn trước.

+2

http://stackoverflow.com/questions/ 751681/nghĩa-of-const-last-in-ac-phương pháp tuyên bố – vid

+4

Câu trả lời ngắn: 'const' đúng đắn. – iammilind

Trả lời

31

Chữ ký đầu tiên có nghĩa là phương thức có thể được gọi trên một cá thể const của một kiểu dẫn xuất. Phiên bản thứ hai không thể được gọi trên các cá thể const. Chúng là chữ ký khác nhau, do đó, bằng cách thực hiện thứ hai, bạn không thực hiện hoặc ghi đè phiên bản đầu tiên.

struct Base { 
    virtual void foo() const = 0; 
}; 

struct Derived : Base { 
    void foo() { ... } // does NOT implement the base class' foo() method. 
}; 
+7

+1 để đề cập rằng chúng không ghi đè lên nhau. –

+3

không, đó là cách khác xung quanh: chức năng đầu tiên có thể được gọi trên cả hai const và không const trường hợp, trong khi thứ 2 chỉ trên không const trường hợp (tôi biết nó phức tạp, tôi đã nhận nó sai quá lần đầu tiên :-) –

+0

giải thích tuyệt vời! – BajaBob

11

Sự khác biệt là chức năng đầu tiên có thể được gọi trên các đối tượng const, trong khi thứ hai không thể. Hơn nữa, hàm đầu tiên chỉ có thể gọi các hàm thành viên const khác trên cùng một đối tượng. Về thừa kế, họ cư xử theo cùng một cách.

Xem thêm C++ FAQ về chủ đề này.

3

Hai chức năng ảo có chữ ký khác nhau nhưng kế thừa sẽ hoạt động theo cùng một cách. Trước đây là một phương thức const và chỉ có thể hỗ trợ các phép toán const (các phương thức) và các đối tượng.

1

phương pháp const không thể thay đổi trạng thái của đối tượng nên

virtual void funcFoo() const = 0; 

sẽ được gọi trong trường hợp const của lớp này với sự khác biệt của

virtual void funcFoo() = 0; 

mà có thể được gọi chỉ trong các trường hợp không liên tục. Hãy thử google cho logic const trong c + +. http://en.wikipedia.org/wiki/Const-correctness

14
virtual void funcFoo() const = 0; 
- You can't change the state of the object 
- You can call this function via const objects 
- You can only call another const member functions on this object 

virtual void funcFoo() = 0; 
- You can change the state of the object 
- You can't call this function via const objects 

Các hướng dẫn tốt nhất hoặc Faq Tôi đã nhìn thấy khoảng correctectness const là C++ FAQ bằng cách parashift:

Hãy xem: http://www.parashift.com/c++-faq-lite/const-correctness.html

+0

Đây là câu trả lời hay nhất. Điều duy nhất mà tôi lộn xộn là hiểu đối tượng 'const' là gì .. –

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