虚函数

时间:2010-03-18 00:49:54

标签: c++

class a
{
 virtual void foo(void) ;
};

class b : public  a
{
public:
 virtual void foo(void)
  {
  cout<< "class b";
  }
};

int main ( ) 
{
class a *b_ptr = new b ;
b_ptr->foo();
}

请指导我为什么b_ptr-&gt; foo()不会调用b类的foo()函数?

4 个答案:

答案 0 :(得分:17)

在编写代码时,由于访问控制违规,它将无法编译。由于b_ptr实际上是a *类型且a::foo是私有的,因此编译器不允许这样做。

但请公开a::foo,这将正确拨打b::foo

还有一个问题是你没有定义a::foo所以你的程序不会链接。您需要定义它或使其成为纯虚拟(即virtual void foo(void) = 0;)。

答案 1 :(得分:3)

因为a:foo()不公开。

答案 2 :(得分:0)

有几件事:

       
  1. foo()而不是foo(void) ...后者是不必要的,而不是惯用的C ++(它是类C语法)。
  2.    
  3. 不要在class中写a* b_ptr = new b;,因为已经声明了类型。
  4.    
  5. 您应该从不返回void的函数返回(添加return 0)。
  6.    
  7. 您的代码永远不会释放b_ptr。写std::auto_ptr<a> b_ptr(new b);
  8. 会更好    
  9. b_ptr的编译时类型(声明类型)是a*,而它的运行时类型(实例化/分配类型)是b*。编译器(和类型系统)只知道编译时类型,因此基于编译时类型执行检查访问权限...因此不允许b_ptr->foo()
  10.    
  11. 使用声明类型的b*或使a::foo公开以您希望的方式使用它。

答案 3 :(得分:-1)

制作

class a
{
public:
    virtual void foo(void);
};

你不能覆盖私人功能。虽然我不知道你是怎么设法拨打b_ptr->foo()的,因为a::foo是私有的。