首页
学习
活动
专区
圈层
工具
发布

虚函数
EN

Stack Overflow用户
提问于 2010-03-18 08:49:54
回答 3查看 420关注 0票数 7
代码语言:javascript
复制
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->foo()不会调用类b的foo()函数?

EN

回答 3

Stack Overflow用户

发布于 2010-03-18 08:54:42

由于您已经编写了代码,因此由于访问控制冲突,它将无法编译。由于b_ptr实际上是a *类型,而a::foo是私有类型,因此编译器不允许这样做。

但是,如果将a::foo公开,就可以正确地调用b::foo

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

票数 17
EN

Stack Overflow用户

发布于 2010-03-18 08:55:16

因为a:foo()不是公共的。

票数 3
EN

Stack Overflow用户

发布于 2010-03-18 09:05:20

几件事:

  1. 写入foo()而不是foo(void)...后者是不必要的,也不是惯用的C++ (它是类似C的语法)。
  2. 不要在class中写class,因为a的类型已经被声明了。
  3. 你应该从一个不返回b_ptr的函数中返回(添加void代码永远不会释放b_ptr)。当b_ptr的运行时类型(实例化/分配类型)为b*时,最好编写std::auto_ptr<a> b_ptr(new b);.
  4. The编译时类型(声明类型)为a*。编译器(和类型系统)只知道编译时类型,因此根据编译时类型执行访问权限检查...因此,b_ptr->foo()不是allowed.
  5. Either,请使用声明的b*类型或将a::foo设置为公共类型,以便以您希望的方式使用它。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2466946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档