Tôi đang cố gắng hiểu một điểm ở đây trong C++. Nếu lớp A có phương thức không ảo, và lớp B, mở rộng A, ghi đè phương thức đó, tôi có thể tạo một thể hiện của B và bằng cách nào đó sử dụng phương thức được định nghĩa trong B không? Có một điểm nào để ghi đè phương thức không phải ảo không?Tôi có thể sử dụng phương pháp ghi đè phương pháp phi ảo không?
Trả lời
Có một điểm để ghi đè lên một phương pháp phi ảo không?
Bạn đang không thực sự trọng, nhưng đây là hành vi, tức là
B* b = new B();
A* a = new B();
b->method(); //Calls B's method
a->method(); // Calls A's method
Vì vậy, các loại con trỏ/tham khảo xác định phương pháp gọi.
tôi có thể tạo phiên bản B và bằng cách nào đó sử dụng phương thức được xác định trong B không?
Có. Con trỏ/kiểu tham chiếu phải thuộc kiểu B. (xem ví dụ trước).
Nếu bạn không khai báo method
là virtual
, bạn không thể ghi đè nó, nhưng bạn có thể ẩn nó.
Câu trả lời tuyệt vời, cảm ơn – Eyal
Một "gotcha" là tình huống khi 'A' lần lượt xuất phát từ một số lớp cơ sở (hoặc thực hiện một giao diện) khai báo phương thức' ảo '() ', trong trường hợp đó phương thức' a->() 'trên thực tế sẽ gọi' B.method() '... – BadCash
@Chip Bạn đã bỏ lỡ nhấn mạnh sự khác biệt. Câu trả lời này chỉ hoàn thành với nhận xét của BadCash. – ManuelSchneid3r
Nếu B
thừa hưởng từ A
, và định nghĩa lại một phương pháp quy định tại A
, sau đó trường hợp mới của B
sẽ gọi phiên bản B
's. Tuy nhiên, nếu phương pháp không phải là ảo, thì không có hành vi đa hình, vì vậy nếu một thể hiện của B
được tham chiếu là A
, thì phương thức sẽ là A
. Ví dụ:
struct A {
void foo() { std::cout << "A::foo" << std::endl; }
};
struct B : public A {
void foo() { std::cout << "B::foo" << std::endl; }
};
B b;
b.foo();
A *a = &b;
a->foo();
Sản lượng của các mã trên sẽ là:
B::foo
A::foo
Tuy nhiên, nếu phương pháp foo
đã ảo, sau đó B::foo
sẽ được in hai lần.
Cũng được viết! :) – niknak
Nếu một chức năng không phải là virtual
sau đó kiểu của biến xác định thực hiện là phái quá:
#include <iostream>
using namespace std;
struct A {
void f() { cout << "A" << endl; }
};
struct B : public A {
void f() { cout << "B" << endl; }
};
int main(int args, char** argv) {
B b;
A& a = b;
b.f();
a.f();
return 0;
}
- Không, không có cơ chế để ghi đè lên một phương pháp không ảo trong lớp A.
- có, bạn có thể sử dụng một phương pháp không ảo từ lớp một quá tải trong B bằng cách sử dụng độ phân giải phạm vi điều hành A :: methodName
- 1. phương pháp phi ảo Overriding
- 2. ghi đè phương pháp ảo C++
- 3. Có thể ghi đè phương thức không phải ảo không?
- 4. Làm thế nào để quá tải một phương pháp ảo khác với phương pháp phi ảo?
- 5. Tìm phương pháp ghi đè
- 6. Phương pháp trừu tượng ghi đè phương pháp trừu tượng
- 7. Sử dụng Groovy metaclass ghi đè lên phương pháp
- 8. Ghi đè phương pháp riêng với Reflection
- 9. Ghi đè phương pháp được bảo vệ
- 10. Tôi nghĩ rằng tôi đã ghi đè một phương pháp ảo nhưng tôi vẫn nhận được: "X phải thực hiện phương pháp ảo thuần túy Y"
- 11. Các phương pháp ghi đè trong JavaDoc
- 12. Ghi đè bằng phương pháp trong DTO's
- 13. Ghi đè backbone 'set' phương pháp
- 14. Tôi có thể phát hiện ra rằng một phương pháp đã bị ghi đè không?
- 15. Phương pháp trừu tượng có phải là ảo không?
- 16. Không ghi đè một phương pháp ảo không phải là const ẩn một quá tải const?
- 17. Ghi đè phương thức bằng so với phương pháp mới
- 18. Java - Phương pháp ảo
- 19. C# không thể gọi quá tải phương pháp phi generic từ phương pháp chung
- 20. Lựa chọn phương pháp có quá tải và ghi đè
- 21. Có thể có Phương pháp bên trong Phương pháp không?
- 22. Phương pháp phải được ghi đè nhưng không trừu tượng?
- 23. Phương pháp mở rộng ảo?
- 24. Chức năng ảo có thể bị ghi đè bởi một chức năng phi ảo không?
- 25. Mocking phương pháp không ảo trong C#
- 26. Sử dụng * phương pháp này trong phương pháp lớp C++ để ghi đè hoàn toàn tự sao chép
- 27. Các phương pháp không ảo trong Java
- 28. Ghi đè (hoặc đổ bóng) một phương pháp với phương pháp mở rộng?
- 29. Java: Gọi một phương pháp siêu trong đó kêu gọi một phương pháp ghi đè
- 30. C++ phương pháp ảo trọng
Những gì bạn mô tả được gọi là * ẩn *, không ghi đè. Hãy xem ở đây, ví dụ: http://stackoverflow.com/questions/2161462/c-inheritance-and-function-overriding – jrok