2012-10-24 35 views

Trả lời

6

sử dụng this->method() bạn gọi một chức năng mà một trong hai được thực hiện trong lớp cha của bạn, hoặc bằng lớp của riêng bạn.

Khi sử dụng superClass::method(), bạn hãy nhớ gọi điện thoại do cha/mẹ thực hiện.

#include <iostream> 
#include <string> 

class A { 
    public: 
    void func() { 
     std::cout << "A func" << std::endl; 
    } 
}; 

class B : A { 
    public:         
    void func() { 
     std::cout << "B func" << std::endl; 
    } 

    void exec() { 
     this->func(); 
     A::func(); 
    } 
}; 

int main() { 
    B b; 

    b.exec(); 
    return 0; 
} 

này mẫu mã sẽ ra

B func 
A func 
3

this->method() lá chỗ cho sự mơ hồ trong những trường hợp nhất định (ví dụ như nếu có nhiều hơn một tổ tiên định nghĩa method với chữ ký này), nhưng đồng thời cho phép method được được gọi là không có vấn đề chính xác nơi nó được xác định. Nếu methodvirtual, nó sẽ gọi phiên bản có nguồn gốc cao nhất.

SuperClass::method() là hiển nhiên. Nó sẽ gọi phương thức cụ thể đó hoặc đưa ra một lỗi trình biên dịch.

+0

Tôi không nghĩ rằng nó quan trọng nếu phương pháp là ảo. Điều gì xảy ra nếu hai cha mẹ có cùng phương pháp ảo nhưng đứa trẻ thì không? – sje397

4
this->method 

Sẽ mặc định thực hiện cục bộ trong lớp dẫn xuất của bạn trước tiên, nếu không có, nó sẽ lấy phương thức siêu lớp. Nếu đó không phải là hiện tại nó sẽ cung cấp cho một lỗi biên dịch.

superClass::method() 

sẽ luôn hướng tới phương pháp này trong lớp cha của bạn

Trong hầu hết các trường hợp, bạn muốn this->method. superClass::method() Có ích khi một phần của một phương thức được thực hiện trong lớp cha và bạn muốn mở rộng nó trong lớp dẫn xuất. một cái gì đó như:

Class SubClass : public SuperClass { 
public: 
void someOtherMethdo(){ 
    SuperClass::someOtherMethdo(); 
    //Rest of the method 
} 
} 
3

Trong ví dụ cụ thể này, không có sự khác biệt.

Nếu phương pháp này là virtual:

  • this->method() sẽ gọi hàm động (gọi phiên bản trên hầu hết thực hiện của lớp)
  • SuperClass::method() kết quả trong một cuộc gọi tĩnh.
5
this->method(); 

... gọi method trên lớp có nguồn gốc (và cũng giống như viết đơn giản method();). Điều này có thể gọi phương thức kế thừa từ cha mẹ (và trong ví dụ), hoặc nó có thể gọi một phiên bản ghi đè trong lớp con (và sẽ, nếu có).

SuperClass::method(); 

... sẽ luôn gọi phương thức trên cấp độ gốc. Cú pháp này thường được sử dụng trong một ghi đè trong đứa trẻ, khi bạn muốn giữ và mở rộng chức năng của phương thức lớp cha. Ví dụ.

Class SubClass: public SuperClass { 
    //... 
    void method() { 
    SuperClass::method(); 
    //... 
    } 
}; 

Lưu ý rằng nếu bạn sử dụng cú pháp đầu tiên trong trường hợp thứ hai này, bạn sẽ nhận được đệ quy.

Cũng lưu ý rằng điều này không liên quan gì đến phương thức virtual. Đánh dấu một phương thức là virtual có nghĩa là, khi phương thức được gọi thông qua một con trỏ lớp cơ sở, phương thức lớp dẫn xuất có sẵn nhất sẽ được gọi. Trong đoạn mã trên, nó không tạo ra sự khác biệt cho dù bất kỳ phương thức nào là ảo vì không có con trỏ lớp cơ sở nào tham gia.

+0

Lưu ý: cha mẹ có thể đã kế thừa phương pháp này. –

1

this->method(); gọi điện cho cha mẹ trong trường hợp của bạn hoặc nếu điện thoại ảo - gọi hàm trên cùng của hàm được triển khai trong vtable. SuperClass::method(); sẽ gọi phương thức của cha mẹ.

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