2010-03-21 2 views
9

abstract function xxx입니까?PHP에서 C++의 가상 함수에 해당하는 것은 무엇입니까?

방금 ​​개인 테스트를 가상으로 수행하는 것으로 보이는 테스트를 만들었습니까?

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(); 

출력은 모두 없음 개인 기능을 가상되도록 명시 적으로 가상으로 선언 할 필요가 없습니다 PHP에서 2

답변

18

입니다.

abstract으로 멤버 함수를 선언하면 기본 클래스가 구현을 제공 할 수 없지만 모든 파생 클래스가 있어야 함을 의미합니다. 추상 같은 방법을 정의하고과 동일한 단순히 파생 클래스 foo();

편집 구현해야 함을 의미합니다 C++

virtual void foo() = 0; 

에서 다음에 대해서는 편집 질문

b::call() 수없는 액세스 a::test(). 이런 이유 때문에 private 함수를 호출 할 때 호출 된 클래스의 호출 만 호출됩니다.

객체 지향 프로그래밍

(Wikipieda)에서, 가상 함수 또는 가상 메소드 동작에서 무시 될 수있는 함수 또는 방법은 : 주석 대하여 :

EDIT 같은 서명을 가진 함수로 상속받은 클래스.

당신이 C++에서 지불하는 것을 명시 적으로 말하기 때문에 파생 클래스가 함수를 재정의 할 수 있도록 함수를 가상으로 선언해야합니다. 위의 샘플에서 변수 fFoo::baz() 가상 여부를 의도 한 유형으로 있다면 그것은 중요하지 않을 형 Bar* 또는 Bar이었다 경우

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 
} 

변경 바즈는 가상

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 
} 

참고가 되실 알려진다 (프로그래머가 명시 적으로 그것을 제공했다)

+0

덕분에, 내가 할 수있는 악화 시켰을 지 몰라도 어떤 가상의 의미를 이해 PHP로 증명할 수 있습니까?PHP에서는 객체를 기본 클래스로 변환 할 수 없으므로 다른 말로하면 PHP에 가상이라는 개념이 없습니까? – user198729

+2

PHP에는 가상이라는 개념이 없습니다. 또는 다른 방법으로는 실제 구현이 런타임에 조회되기 때문에 모든 메소드가 가상입니다. – VolkerK

+0

PHP에서는 가상 개념이 없다고 생각하는 것이 더 낫습니다. 'Foo * f = new Bar();' – user198729

4

이 예제는 구현 세부 사항이 call() 인 것을 알 필요가없는 전형적인 전문화 패턴을 보여주지 않았지만 spec ify how test()하는 방법입니다. 그리고 불행히도 1을 반환합니다. 그러나 private 대신 protected 함수를 선언하면 예상대로 작동합니다.

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(); 
1

사용 static 키워드 (PHP 5.4) 하지 $ this-> 메타() 하지만 정적 :: 메타() 데모에 대한

관련 문제