Trong PHP tất cả các chức năng riêng không là ảo do đó không cần phải tuyên bố rõ ràng chúng như ảo.
Khai báo hàm thành viên là abstract
chỉ đơn giản có nghĩa là lớp cơ sở không thể cung cấp triển khai nhưng tất cả các lớp bắt nguồn phải. Xác định phương pháp như trừu tượng cũng giống như cách làm như sau trong
virtual void foo() = 0;
C++ mà chỉ đơn giản có nghĩa là thừa kế các lớp phải thực hiện foo();
EDIT: Về câu hỏi sửa
b::call()
không thể truy cập a::test()
. Vì lý do này khi gọi các hàm riêng tư chỉ có một trong lớp mà nó được gọi từ sẽ được gọi.
EDIT: Về nhận xét:
(Từ Wikipieda)
Trong lập trình hướng đối tượng, một hàm ảo hoặc phương pháp ảo là một chức năng hoặc các phương pháp mà hành vi có thể được ghi đè trong vòng một lớp kế thừa bởi một hàm có cùng chữ ký.
Do ý tưởng nêu rõ những gì bạn thanh toán trong C++, bạn phải khai báo hàm là ảo để cho phép các lớp dẫn xuất ghi đè hàm.
class Foo{
public:
void baz(){
std::cout << "Foo";
}
};
class Bar : public Foo{
public:
void baz(){
std::cout << "Bar";
}
};
int main(){
Foo* f = new Bar();
f->baz(); //baz is not virtual in Foo, so the output is Foo
}
Thay đổi baz là ảo
class Foo{
public:
virtual void baz(){
std::cout << "Foo";
}
};
//Same Bar declaration
int main(){
Foo* f = new Bar();
f->baz(); //baz is virtual in Foo, so the output is Bar as it will call the derived function
}
Lưu ý, nếu biến f
trong ví dụ trên là loại Bar*
hoặc Bar
nó sẽ không quan trọng nếu Foo::baz()
là ảo hay không như các loại dự kiến được biết đến (Lập trình viên đã cung cấp nó rõ ràng)
Cám ơn demo, tôi hiểu những gì có nghĩa là ảo now.But thể bạn cũng chứng minh nó với PHP?Bởi vì dường như trong PHP không thể chuyển đổi một đối tượng thành lớp cơ sở, nói cách khác, không có khái niệm nào như ảo trong PHP? – user198729
Không có khái niệm nào như ảo trong php. Hoặc theo cách khác, mọi phương thức đều là ảo vì việc triển khai thực tế được xem xét trong thời gian chạy. – VolkerK
Tôi nghĩ tốt hơn nên nghĩ rằng không có khái niệm ảo trong PHP, vì không thể làm điều này bằng ngôn ngữ này: 'Foo * f = new Bar();' – user198729