什么是PHP中的c ++虚函数?

时间:2010-03-21 16:05:10

标签: php virtual abstract

abstract function xxx吗?

我刚做了一个测试,似乎表明私有方法也是虚拟的?

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

输出为2

3 个答案:

答案 0 :(得分:18)

在PHP中,所有私有函数都不是虚函数,因此不需要将它们显式声明为虚函数。

将成员函数声明为abstract只是意味着基类不能提供实现,但所有派生类都应该。将方法定义为抽象与在C ++中执行以下操作相同

virtual void foo() = 0;

这意味着派生类必须实现foo();

编辑:关于已修改的问题

b::call()无法访问a::test()。因此,在调用私有函数时,只会调用调用它的类中的函数。

修改: 关于评论:

(来自Wikipieda)

  

在面向对象的编程中,虚函数或虚方法是一种函数或方法,其行为可以通过具有相同签名的函数在继承类中重写。

由于明确说明您在C ++中支付的费用,您必须将函数声明为虚拟,以允许派生类覆盖函数。

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
}

将baz更改为虚拟

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
}

注意,如果上述示例中的变量f属于Bar*Bar,那么Foo::baz()是否为虚拟无关紧要已知(程序员明确提供)

答案 1 :(得分:4)

该示例未显示典型的特化模式,其中b不需要知道call()的实现细节,但可以指定test()的完成方式。它遗憾地返回1。但是,通过声明受保护的功能而不是私有功能,它将按预期工作。

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

答案 2 :(得分:1)

使用static关键字(php 5.4) 不     $这 - &GT;甲基() 但     静态::甲基()