C++ 虚函数 a类 { 虚拟void-foo(void); }; b类:公共a { 公众: 虚拟void foo(void) { coutfoo(); }

C++ 虚函数 a类 { 虚拟void-foo(void); }; b类:公共a { 公众: 虚拟void foo(void) { coutfoo(); },c++,C++,请告诉我为什么b_ptr->foo()不会调用类b的foo()函数 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

请告诉我为什么b_ptr->foo()不会调用类b的foo()函数

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()的
无论如何,因为
a::foo
是私有的。

在编写代码时,由于访问控制冲突,它不会编译。因为
b\u ptr
实际上是
a*
类型,并且
a::foo
是私有的,编译器不允许这样做

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

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

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

有几件事:

<> >写<代码>脚注():<代码> >而不是<代码> FO(无效)<代码>……后者是不必要的,不是惯用的C++(它是C类语法)。
  • 不要在
    a*b_ptr=new b;
    中写入
    class
    ,因为a的类型已经声明
  • 您应该从不返回void的函数返回(添加
    返回0
  • 您的代码永远不会释放
    b_ptr
    。最好编写
    std::auto_ptr b_ptr(新b);
  • b_ptr
    的编译时类型(声明类型)是
    a*
    ,而它的运行时类型(实例化/分配类型)是
    b*
    。编译器(和类型系统)只知道编译时类型,因此根据编译时类型执行访问权限检查……因此
    b_ptr->foo()
    是不允许的
  • 可以使用声明的
    b*
    类型,也可以将
    a::foo
    设置为public,以您希望的方式使用它。
    b_ptr声明的主要内容不应在“类”之前瑞秋,我想补充说,它不应该是非法的,在这种情况下它是没有用的。Drahakar,它仍然不是惯用的C++,不应该做。同样,一个显式的空隙参数是允许的,但是是C语法,不是惯用的C++,因此应该避免。Michael Aaron Safyan,从我所看到的,它的空虚参数没有实际用途,但是如果类名称A将被函数结构名称隐藏,那么声明类A*BYPTR会有帮助。在注释的C++页面167中,你可以找到这个例子。我同意你在这个例子中没有实际价值,但我仍然认为这是个好东西。不是真的。你当然可以重写私有函数-这实际上是一个很好的实践。我不明白你的意思。解释?重写私有函数是合法的;它只是私有的,所以你不能调用它(通过基类)由非朋友提出。通常使用仅由基类的成员函数调用的私有虚拟函数。我忘记了此模式的调用方式,但这是在有固定的整体算法时获得可修改子行为的一种方法。例如,如果您编写的是通用寻呼机,则其打印函数可能是:WritePageNumber、WriteHeader、WriteLines、WriteFooter,每个都可以修改,但总体行为是一致的。它被称为“模板方法”设计模式。我不知道。谢谢伙计们。我不知道重写私有方法是合法的。我将不讨论这个问题,因为会出现评论。:-+1您可能想说违反了访问规范,以区别这与使用恶意指针时发生的情况:P@BillyONeal-虽然我决定去,但我还是喜欢你推荐的要点与访问控制冲突更接近于标准对这个问题的描述。@GMan:你如何区分那些想要
    返回0而没有写任何东西的人和那些根本没有考虑返回值的人?@Bill:I不知道。他们在需要返回值的函数中忘记了返回值?@GMan:正如你所指出的,
    main
    不需要
    return
    。你如何区分这两者之间的区别呢?@Bill:你不需要。你的观点是什么?我们不需要浪费时间走报春花路,就像这里有更深的含义一样。第3项是错误信息,它没有提及我所说的任何内容。正确的观点是“你可能忘了返回0,虽然你在这里很幸运,因为
    main
    隐式返回0”。请说明问题以及它仍然有效的原因。@Gman:啊,我明白了。我以为你的意思是因为
    main
    隐式返回0,所以项目3根本不需要在那里。没关系!
    class a
    {
    public:
        virtual void foo(void);
    };