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