加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – “方法’%s’隐藏基类型’%s’的虚方法”.究竟隐藏

发布时间:2020-12-15 10:12:58 所属栏目:大数据 来源:网络整理
导读:在阅读了 Ian Boyd的构造函数系列问题( 1,2,3,4)后,我意识到我并没有完全掌握隐藏内容的字面含义. 我知道(纠正我,如果我错了)覆盖的唯一目的是能够具有多态行为,以便运行时可以根据实例的实际类型解析方法 – 而不是声明的类型.请考虑以下代码: type TBase
在阅读了 Ian Boyd的构造函数系列问题( 1,2,3,4)后,我意识到我并没有完全掌握隐藏内容的字面含义.

我知道(纠正我,如果我错了)覆盖的唯一目的是能够具有多态行为,以便运行时可以根据实例的实际类型解析方法 – 而不是声明的类型.请考虑以下代码:

type
  TBase = class
    procedure Proc1; virtual;
    procedure Proc2; virtual;
  end;

  TChild = class(TBase)
    procedure Proc1; override;
    procedure Proc2;            // <- [DCC Warning]
  end;

procedure TBase.Proc1;
begin
  Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
  Writeln('Base.Proc2');
end;

procedure TChild.Proc1;
begin
  inherited Proc1;
  Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
  inherited Proc2;
  Writeln('Child.Proc2');
end;

var
  Base: TBase;
begin
  Base := TChild.Create;
  Base.Proc1;
  Writeln;
  Base.Proc2;
  Base.Free;
  Readln;
end.

哪个输出:

Base.Proc1
Child.Proc1

Base.Proc2

TChild.Proc2 states that上的警告此方法“将隐藏对同名基础方法的访问”.我所看到的是,如果我不重写Proc2,我会失去该方法解析其实际类型的能力,而不是其基本类型.如何隐藏对base方法的访问?

此外,关于警告的文档作为警告的解决方案,声明:

First,you could specify override to
make the derived class’ procedure also
virtual,and thus allowing inherited
calls to still reference the original
procedure.

现在,如果我从’TChild'(没有多态)创建’TChild’实例,则非重写方法中的继承调用显然是指原始过程.如果我从’TBase’创建’Child’实例,则调用甚至不会解析为’TChild’方法,我怎么能调用’Inherited’来引用任何东西呢?

我有什么误会?

解决方法

Amongs其他的东西,你将无法定义
TGrandChild = class(TChild) 
  procedure Proc2; override;
end;

因为TGrandChild看到的Proc2是来自TChild的非虚拟的. TChild.Proc2隐藏来自后代的TBase.Proc2.

编辑:

在回答Sertac的评论时:

var 
  Base: TBase; 
  Child : TChild
begin 
  Child := TChild.Create;
  Base := Child;
  Base.Proc2; 
  Child.Proc2;

  Base.Free; 
  Readln;

这将输出

Base.Proc2
Base.Proc2
Child.Proc2

因此,似乎是对同一方法的两次调用实际上是对2种不同方法的调用.这使得代码更难理解(这是不实际的)并产生意外行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读