2010-03-21 80 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(); 

输出是2

回答

18

在PHP中所有无专用功能是虚拟的,所以没有必要明确地声明为虚。

声明一个成员函数作为abstract简单地意味着该基类不能提供一个实现,但所有派生类应该。定义方法为抽象相同做以下用C++

virtual void foo() = 0; 

它只是意味着派生类必须实现foo();

编辑:关于修改的问题

b::call()无法访问a::test()。因为这个原因,当调用私有函数时,只会调用它被调用的类中的函数。

EDIT: 关于评论:

(来自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 
} 

变化巴兹是虚拟

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 
} 

注意,如果上述样品中的可变fBar*是类型或Bar它不会有问题,如果Foo::baz()是虚拟的或不如预期的类型是已知的(程序员显式提供它)

+0

感谢您的演示,我明白了什么虚指now.But能你也用PHP来证明它?因为在PHP中似乎不可能将对象转换为基类,换句话说,在PHP中不存在虚拟这样的概念? – user198729 2010-03-21 16:40:01

+2

在虚拟中没有这样的概念。或者相反,每个方法都是虚拟的,因为在运行时查找实际实现。 – VolkerK 2010-03-21 16:52:45

+0

我认为在PHP中没有虚拟概念会更好,因为用这种语言来做这件事是不可能的:'Foo * f = new Bar();' – user198729 2010-03-21 16:57:50

4

的例子并没有表现出典型的专业化模式,其中b并不需要知道的call()实现细节,但可以规范ify如何完成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(); 
1

使用static关键字(PHP 5.4) 不 $这个 - >甲基() 但 静::甲基()

相关问题