如何从外部访问基类中虚函数(在派生类中OVERRIDE过)?(100分)

  • 主题发起人 主题发起人 demonP
  • 开始时间 开始时间
D

demonP

Unregistered / Unconfirmed
GUEST, unregistred user!

我想用类似C++的 : ObjPtr->BaseClass::BaseFunction()

的方式调用一个基类中的虚方法,派生子类中OVERRIDE了它,
现在我只能在子类的方法中用 inherited
实现,但不知道
如何从外部越过多态性的限制,直接调用基类虚方法。
请指点,谢谢!
 
没道理吧,如果你要仅仅使用基类中的虚方法,为什么不把对象声明为基类类型呢?

声明为子类类型,目的就是利用继承与多态的优势,并且把基类的信息封装起来了,
C++中的过于灵活的方式会养成不良编程习惯的,外部程序也知道基类信息,这样合理吗?

当然,如果一定要实现,可以为你需要这样做的方法加参数来解决,例如:

procedure childclass.proc1(BaseClassOnly:Boolean);
begin
inherited;
if BaseClassOnly then exit
else //子类本身处理
end

 
to:温柔一刀
我只是好奇,想知道DEPHI能否实现,还没有碰见实际需要的地方,
我认为你说的有道理,太多的自由有时候反而添麻烦,另外,你说的
方法也就是我问题里说的在子类方法里用INHERITED吧,这个方法也
不能从“外部”实现我的要求. 这个问题似乎也不用再讨论了.谢谢
老兄了.

TO:JAMES
>>是什么意思?
 
>>这个方法也不能从“外部”实现我的要求

可以呀,当你从外部调用子类的func1时候,
你调用childclass.func1(true),就实现了只调用基类方法,
childclass.func1(false),就是调用整个方法。只不过都是
“走”了子类的过程,但结果应该是你需要的。
 
我的意思是,如果只有一个对象引用的情况(也就是不派生自己的子类)的
情况下进行访问,当然派生的方法也算是个变通的方法。
我问这个问题的用意关键在于想知道,在DELPHI中有没有C++里
objptr->BaseClass::func()
的直接等价物。看来应该是没有的了,是不是?
知道了这一点也就达到了我的目的。
 
应该是没有吧,希望是没有 :-),可以等等其他人的意见。

另外,C++里真的有这种语法吗?我从来没注意过,
我觉得很不科学呀!实在不怎么样。
 
算出多少代, inherited inherited inherited MyMethod
(连放几个inherited,行不行?没有delphi,试不了)
 
没道理,实在没道理。能这样用吗?
不如直接修改基类了。
 
var
ObjName: TChildClass;
begin
ObjName.MethodName;
TParentClass(ObjName).MethodName
// 这样应该可以实现
end;
 
多人接受答案了。
 
不知道这个问题什么时候结束的,我头都大了,
应该就是BaKuBaKu写的这样吧!
我怎么想也没想?大概是被提问者的说话方式弄糊涂了,
什么“越过多态的限制”,不就是强制转换吗?
ObjPtr->BaseClass::BaseFunction()
这种语法C++也没有吧?
应该是(BASEClass *) ObjPtr->XXXXFunction();吧?
 
或许我说的不太清楚,C++是有这个语法的,强制转换是做不到
这个效果的,否则多态性就美意思了,你转换后调用的还是派生
类的函数。
 
看来我脑子真的是大了,我原来说的对,现在却糊涂了,呵呵
现在再回头看,我的第一个贴字说得多好呀! :-)
唉!又显示了一次不假思索回答问题的害处! :-)

C++真的有这语法?我怎么不记得了?
 
后退
顶部