请教各位大虾:问个C++中有关派生类中函数重载的问题:(100分)

  • 主题发起人 主题发起人 netbug
  • 开始时间 开始时间
N

netbug

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道:在C++中,允许函数重载,即编译器会根据参数的不同,<br>自动调用同名的重载函数.<br>而在继承与派生中,子类对父类的成员函<br>数进行改造的方法有两种:重载与覆盖.其中重载也就是<br>子类对父类的同名的成员函数进行改造,使子类与父类的同名的<br>成员函数具有不同的形参,即形成重载.<br>请看:<br>#include&lt;iostream.h&gt;<br>class A<br>{<br>public:<br>void f();<br>};<br>class B<br>{<br>public:<br>void f(int x);<br>};<br>void A::f()<br>{<br>cout&lt;&lt;"space"&lt;&lt;endl;<br>}<br>void B::f(int x)<br>{<br>cout&lt;&lt;"x="&lt;&lt;x&lt;&lt;endl;<br>}<br>void main()<br>{<br>A a1;<br>B b1;<br>a1.f();<br>b1.f(7);<br>b1.f();<br>}<br>此程序不能编译通过,系统提示b1.f()出错,我把它改成b1.A::f()就能通过.<br>我想问:<br>1.既然允许子类对父类的成员函数进行重载,那为何B类的对象b1不会<br>根据形参的不同,自动调用A类中的同名函数?(A类与B类中的同名函数f的<br>参数的不同)<br>2.如果一定要加类名限定写成b1.A::f(),那与函数覆盖有何不同?<br>3.请问在继承与派生中,如何判断函数重载与函数覆盖?<br>能否举例说明?<br>谢谢.
 
class B应该再写一次 f()<br><br>class B:public A<br>{<br>public:<br>void f(int x);<br>void f()<br>&nbsp;{ A::f(); }<br>};<br>
 
你写的不象是重载<br>
 
C++不能像Delphi中那样进行跨类层次的函数重载,C++重载的概念限制于<br>同一类中或是同一范围中。一旦牵扯到继承,就只有虚拟函数<br>或是覆盖了(不过覆盖作为专门的定义也只是Delphi里有),不知<br>你所说“在继承与派生中,子类对父类的成员函数进行改造的<br>方法有两种:重载与覆盖” 从何而来。<br><br>另外,C++中的覆盖是很无情的,就是说哪怕基类中的某个函数<br>有很多个重载的版本,派生类的同名函数可以把它们统统覆盖掉,<br>如果要通过子类实力调用其中之一,只有显式的使用基类名称和<br>范围分解符。
 
在B的实例中应该有两个f的函数实现,<br>例如:<br>main()<br>{<br>&nbsp; &nbsp; B b ;<br>&nbsp; &nbsp; b.f(1) ; //调用B中的void f(int x)<br>&nbsp; &nbsp; ((A)b).f() ; //调用A中的void f(x)<br>&nbsp; &nbsp; b.f() ; //编译时会抱错<br>}
 
好象没有提出任何需要解决的问题?<br>大家怎么回答?
 
To mud_glory:<br>因为C代码中大量使用小于号,因而容易使浏览器产生解释错误,<br>右击页面,查看一下源代码就知道了。<br><br>我觉得可以这样写:<br>A(b).f();
 
》》netbug<br>你写的不是重载
 
多人接受答案了。
 
后退
顶部