⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_52099.htm

📁 vc
💻 HTM
字号:
<p>
序号:52099 发表者:Bardo 发表日期:2003-09-08 00:06:03
<br>主题:谁能告诉我,覆盖(override)虚函数与覆盖(override)非虚函数有什么区别?
<br>内容:谁能告诉我,覆盖(override)虚函数与覆盖(override)非虚函数有什么区别?标准C++说非虚函数为能覆盖,是真的吗?VC怎么可以覆盖?区别在何处?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:jinir 回复日期:2003-09-08 11:41:39
<br>内容:如果是虚函数,类就会保存一个vtable,是指向virtual function的表,所以既使是定义的基类的指针也可以找到派生类的虚函数的指针,如果是非虚函数,基类的指针就把直接调用函数体,不会也无法找到派生类的函数体
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Bardo 回复日期:2003-09-08 12:06:03
<br>内容:TO:jinir<BR><BR>还没有懂。谢谢你,经你讲解,问题更多:<BR><BR>vtable,virtual function有什么用,具体功能是什么?<BR><BR>“找到派生类的虚函数的指针”此话怎讲?“标准C++说:虚函数才能覆盖,非虚函数不能覆盖”,覆盖不是派生覆盖基类吗?怎么又说派生类虚函数指针?<BR><BR>“如果是非虚函数,基类的指针就把直接调用函数体,不会也无法找到派生类的函数体”这个好象不对!!!<BR>照你这一说法,非虚函数就覆盖不了,或者说覆盖了无法执行。你到VC中试一下,绝不是这样!<BR><BR>请高手帮助解惑!谢谢了。我看书不看,还清楚,越看越糊涂!!<BR> 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:jinir 回复日期:2003-09-08 14:48:44
<br>内容:vtable是C++实现虚函数的手段,在类中保存一个指向vtable的指针,如果函数是virtual修饰的话,调用函数就会有一段附加的代码,查询到变量指针目前所指的类(可能是派生类)的函数(也就是适当的虚函数)体.<BR>如果函数未用virtual修饰,那么基类指针只能访问到基类的函数,即使指向了派生类也是如此.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Bardo 回复日期:2003-09-08 17:34:57
<br>内容:还有问题:竟究什么是覆盖(override)呢?<BR>假如按某本书所说:<BR>基类是虚函数,派生类重定义则是覆盖<BR>那么,基类中不是虚函数,派生类重定义则是什么??????
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:萧七 回复日期:2003-09-08 17:49:59
<br>内容:非虚函数在语义上就是叫你别覆盖它的<BR>所以,如果要覆盖它,就声明成虚函数<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2003-09-08 18:01:36
<br>内容:其实一种叫做隐藏,一种叫做覆盖,或者叫做重写<BR>所谓隐藏,是基类的非virtual函数被派生类的同名函数完全代替了,无论你用指针还是引用,除非你明确指出来要调用基类的那个函数,否则基类的函数都无法得到调用<BR>比如<BR>struct base<BR>{<BR>void foo(){printf(&#34;base\n&#34;);};<BR>};<BR>struct der:public base<BR>{<BR>void foo(){printf(&#34;der\n&#34;);};<BR>};<BR>int main()<BR>{<BR>base *p=new der();<BR>p-&gt;foo();<BR>/*<BR>here foo() will output &#34;base&#34;.<BR>if foo() is a virtual function in base class, here will output &#34;der&#34;.<BR>*/<BR>delete p;<BR>return 0;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Bardo 回复日期:2003-09-08 18:10:02
<br>内容:还是糊涂,什么 “非虚函数在语义上就是叫你别覆盖它的,所以,如果要覆盖它,就声明成虚函数”!!<BR>不明白,什么意思!<BR>看来是太笨!<BR><BR>“其实一种叫做隐藏,一种叫做覆盖,或者叫做重写”倒底什么是隐藏?<BR><BR>有没有好的一本C++电子教程可看,哪位高人推荐一下。<BR>听这种讲解,我可能要过50年才能弄懂C++,真的没有人能讲清为什么不虚,为什么虚吗?<BR><BR>谢谢了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2003-09-08 20:40:12
<br>内容:你知道什么是虚函数吗?<BR>你派生类的函数名字跟基类的函数名字一样,同时基类的函数是虚函数,就叫做覆盖<BR>如果不是虚函数,就叫做隐藏
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:水番 回复日期:2003-09-08 21:20:41
<br>内容:使用虚函数是为了实现多态( 可能你又要问什么是多态了 :-) ),举个例子:<BR>class B<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual ~B() { }<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Print() const { cout &lt;&lt; &#34;class B.&#34; &lt;&lt; endl; }<BR>};<BR><BR>class D : public B<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Print() const { cout &lt;&lt; &#34;class D.&#34; &lt;&lt; endl; }<BR>};<BR><BR>int main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;B* d = new D;<BR>&nbsp;&nbsp;&nbsp;&nbsp;d-&gt;Print();<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete d;<BR>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>}<BR><BR>那么屏幕会输出:<BR>class B.<BR><BR>如果你把 class B 中的<BR>&nbsp;&nbsp;&nbsp;&nbsp;void Print() const { cout &lt;&lt; &#34;class B.&#34; &lt;&lt; endl; }<BR>改成<BR>&nbsp;&nbsp;&nbsp;&nbsp;virtual void Print() const { cout &lt;&lt; &#34;class B.&#34; &lt;&lt; endl; }<BR><BR>那么屏幕就会输出:<BR>class D.<BR>也就是程序运行的时候知道调用 class D 的 Print,这就是多态的威力。通俗一点讲,多态就是象是看到和尚的时候,你知道他是和尚而不会误认为是道士,虽然他们都是人。<BR>2003-9-9 14:33:16

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -