PHP c + + sanal fonksiyonlarının eşdeğer nedir?

2 Cevap php

Öyle mi abstract function xxx?

Ben sadece çok sanal olmak için özel bir yöntem işaret görünüyor bir test yaptı?

class a {
 private function test()
 {
  echo 1;
 }
}

class b extends a {
 private function test()
 {
  echo 2;
 }
 public function call()
 {
  $this->test();
 }
}

$instance = new b;
$instance->call();

Çıkış 2

2 Cevap

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)

Örnek b call() uygulanması ayrıntıları bilmek gerekmez ama test() yapılması nasıl belirleyebilirsiniz tipik bir uzmanlık desen yoktu. Ve 1 maalesef çıkmıyor. Beklendiği gibi Ancak, bunun yerine özel korunan işlevi bildirerek, bu iş olacak.

class a {
    protected function test()
    {
        echo 1;
    }
    public function call() {
        $this->test();
    }
}

class b extends a {
    protected function test()
    {
      echo 2;
    }
}

$instance = new b();
$instance->call();