PHP tüm hiçbiri özel fonksiyonlar sanal yüzden açıkça sanal olarak bunları bildirmek için gerek yoktur.
Gibi bir üye işlev ilan abstract
sadece temel sınıf bir uygulama sağlamak anlamına gelir ama tüm sınıf türetme gerekir. Soyut olarak tanımlanması yöntemi C + + aşağıdaki yapıyor gibi aynı
virtual void foo() = 0;
Sadece bunun anlamı sınıf türetme must uygulamak foo();
EDIT: Düzenlenen soru ile ilgili
b::call()
Yapamam erişim a::test()
. Bu nedenle adı verilecek çağrıldı sınıfta sadece bir özel işlevlerini çağırırken.
EDIT:
Regarding the comment:
(Wikipieda itibaren)
Nesne yönelimli programlama, sanal bir işlev veya sanal bir yöntem olan davranış aynı imzaya sahip bir fonksiyon tarafından bir türetilen sınıf içinde kılınabilir bir işlev veya bir yöntemdir.
Nedeniyle açıkça C + + için ne ödeme belirten fikrine, sen türetilmiş sınıfları bir işlevi geçersiz kılmak için izin sanal olarak işlevlerini bildirmek zorunda.
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
}
Sanal olarak Baz değiştirme
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
}
Yukarıdaki örnekteki değişken f
türünde Bar*
veya Foo::baz()
sanal olsaydı veya Bar
önemli değil idi ise, Not amaçlanan tipi bilindiği gibi değil (programcı açıkça verilir)