一个简单的问题,面向对象的 ( 积分: 50 )

  • 主题发起人 主题发起人 coolzew
  • 开始时间 开始时间
C

coolzew

Unregistered / Unconfirmed
GUEST, unregistred user!
ta = class
public
function aaa:boolean;virtual;
end;
tb = class(ta)
public
function aaa:Boolean;override;
end;
{ ta }

function ta.aaa: boolean;
begin
Result := True;
end;

{ tb }

function tb.aaa: Boolean;
begin
Result := False;
inherited aaa;
// inherited
//为什么这样写会报错呢???????
end;

测试代码如下:
var b :tb;
begin

b := tb.Create;
if b.aaa then showMessage('');//返回的结果总是False
end;
问题在注释中,请高手解答
 
ta = class
public
function aaa:boolean;virtual;
end;
tb = class(ta)
public
function aaa:Boolean;override;
end;
{ ta }

function ta.aaa: boolean;
begin
Result := True;
end;

{ tb }

function tb.aaa: Boolean;
begin
Result := False;
inherited aaa;
// inherited
//为什么这样写会报错呢???????
end;

测试代码如下:
var b :tb;
begin

b := tb.Create;
if b.aaa then showMessage('');//返回的结果总是False
end;
问题在注释中,请高手解答
 
function aaa:boolean;virtual;虚函数还会有函数体吗?
function ta.aaa: boolean;
begin
Result := True;
end;
 
function tb.aaa: Boolean;
begin
Result := False;
inherited aaa;
// inherited
//为什么这样写会报错呢??????? //你重载的是函数并不是方法,所以必须加上函数名。
end;

你知道为什么不会返回true吗?因为就是函数的原因。你只是执行了Inherited aaa,并没有给Result赋值啊。应该这样写:Result := inherited aaa;
 
虚拟方法也是可以有函数体的啊,
我有一些疑问,为什么是过程就可以直接写inherited.呢
如果写成 Result := inherited aaa,那Override关键字又有何用呢?
 
inherited aaa;
// inherited;
不懂
 
在用inherited时,编译会出现:
Incompatible types;
当派生类重定义了基类的虚方法后,由于重定义的派生类的方法地址无法给出,其调用地址在编译期间便无法确定,故基类指针必须根据赋给它的不同的派生类指针,在运行期动态地(记住:是动态!)调用属于派生类的虚方法。
由于你定义的方法为函数,在编译期间如果不指定inherited aaa;可能编译器无法确定Result的类型是否相符而出错.
 
// if b.aaa then showMessage('');//返回的结果总是False
这是正常的.因为虽然你调用了inherited aaa;但是并没有把返回值保存到自己的返回值.
result:= inherited aaa();这样才行.

// inherited
//为什么这样写会报错呢???????
这个需要有环境调试一下,你需要检查堆栈是否正确.以及是否跳转到了正确的位置.

保持自己代码的严谨,这是一个良好的习惯.比如在调用无参数的函数时仍然添加()等等.那么碰到的问题就会较少
 
正如楼上所说
 
小问题见真工夫啊
学习一下!
 
呵呵!coolzew你的问题其实与OOP没有任何关系。你的语句没有任何问题。为什么没有返回你期望的值呢?请相信inherited aaa确实执行了!但它的执行不会对你的RESULT产生任何影响,除非你把结果赋到RESULT。
也就是 result := inherited aaa.
归根结底是你把PROCEDURE 和 FUNCTION 的混为一谈了。
不知道我的回答是否能给你一点提示
 
ZJAN51的回答我感觉有点画蛇添足
result:= inherited aaa() 和 result:= inherited aaa
在不带参数的情况下没有区别的。
可能 ZJAN51是干C++出身的

关于 inherited;完全同意方竹,也就是晚绑定的问题。
没有晚绑定也就不要谈多态,VIRTUAL就没有任何意义
 
说到底是楼主还是没有理解什么是重载~~在重载里result:= inherited aaa;有意义吗?
 
function tb.aaa: Boolean;
begin
Result := False;
Result := inherited aaa;
// inherited
//为什么这样写会报错呢???????
end;
 
//来自:sanmaotuo, 时间:2005-6-30 15:48:02, ID:3119656
//ZJAN51的回答我感觉有点画蛇添足
我有这个习惯,不过我的C++并不好。只是我不是很喜欢这种函数调用不加()的写法。在复杂的代码中,特别是分析别人的代码.如果在函数调用的时候添加(),那么会有助于理解.
 
result结果覆盖呀!Result := inherited aaa;这样就行。。。
 
ZJAN51的回答我感觉有点画蛇添足
result:= inherited aaa() 和 result:= inherited aaa
在不带参数的情况下没有区别的。
可能 ZJAN51是干C++出身的

不加()的 你回去试试,就知道即使空()加了非常优美 易读
还有end;前的语句末尾不要省略;号
正如c++中 if (xxx) {};后面的分号也是可以省略的,但是加了好
 
接受答案了.
 
后退
顶部