Khi tôi đọc hiệu quả C++, nó nói, không bao giờ xác định lại hàm không phải ảo trong C++.xác định lại hàm không phải ảo trong C++
Tuy nhiên, khi tôi thử nghiệm, mã bên dưới biên dịch chính xác. Vậy vấn đề là gì? Đó là một sai lầm hoặc chỉ là một thực hành xấu?
class A {
public:
void f() { cout<<"a.f()"<<endl;};
};
class B: public A {
public:
void f() { cout<<"b.f()"<<endl;};
};
int main(){
B *b = new B();
b->f();
return 0;
}
Câu trả lời đáng yêu! Ngắn gọn, cho điểm, và cho thấy cách lập trình cảm xúc. – DarenW
Tôi không đồng ý, tác giả Scott Meyers chỉ ra rằng thừa kế công khai thiết lập một sự bất biến về chuyên môn hóa cho lớp b. Hơn nữa, việc sử dụng lớp là khó hiểu khi hành vi của hành vi f() phụ thuộc vào định nghĩa con trỏ không phải là định nghĩa đối tượng. Ví dụ: B x; A * ptr = & x; ptr-> f() // gọi phiên bản lớp A của f() và không phải là phiên bản lớp B của f() và điều đó gây nhầm lẫn. – TheChrisONeil