虚拟方法virtual的用法

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

TFather = class
  public
    procedure Fa; // virtual;
  end;

TChild = class(TFather)
  public
    procedure Fa; // override;
    procedure Ca;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TChild }

procedure TChild.Ca;
begin
  ShowMessage(‘Childer‘);
end;

procedure TChild.Fa;
begin
 // inherited;
end;

{ TFather }

procedure TFather.Fa;
begin
  ShowMessage(‘Father‘);
end;

procedure TForm1.Button1Click(Sender: TObject);              // C->F
var
  F: TFather;
begin
  F := TChild.Create;
  F.Fa;
 // F.Ca; //编译不过去
end;

procedure TForm1.Button2Click(Sender: TObject);              // C(F)
var
  F: TFather;
begin
  F := TFather.Create;
  TChild(F).Fa; //***  声明方法时,如果不用 virtual 和 override 关键字修饰的话
                //***  那么在子类实现时要手动的调用 inherited 才可以正确调用父
                //***  类实现的方法,但是如果使用了 virtual 和 override 的话,
                //***  则可以不用手动的调用 inherited 也能正确调用(即当按Ctrl+C
                //***  时会自动添加inherited。

TChild(F).Ca; //虽然创建的是父类,但是强制转换后(重新设定对象范围)可以调用。
                //但是不确定是否会有意外的错误发生。
                //如果使用了关键字override,编译器会使用晚帮定,即到运行是根据实
  //际的对象来决定调用父类方法还是子类方法
  //换句话说就是使用了关键字的话,强制转换将不起作用。(起到的作用
  //只是检测到父类中是否有此方法了,有可以调用,但是调用的还是子类
  //的方法,要是没有就根本不能调用)
end;

procedure TForm1.Button3Click(Sender: TObject);              // F(C)
var
  C: TChild;
begin
  C := TChild.Create;
  TFather(C).Fa;
  //TFather(C).Ca;     //编译不过去
end;

end.

虚拟方法virtual的用法,布布扣,bubuko.com

时间: 2024-10-15 15:15:00

虚拟方法virtual的用法的相关文章

虚方法virtual详解

虚方法virtual详解 从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类. 如:飞禽 bird = new 麻雀();那么飞禽就是申明类,麻雀是实例类. 具体的检查的流程如下 1.当调用一个对象的函数时,系统会直接去检

虚拟主机 (Virtual Host)

虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术. 可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口, 也可让多个网站拥有不同的域名. Apache 是世界上使用最广的 Web 服务器, 从 1.1 版开始支持虚拟主机. 本文将讲解在不同服务器 (Redhat Enterprise Linux, Ubuntu Linux, Windows) 上使用 Apache 搭建虚拟主机来搭建多个网站. Redhat Enterpri

C#中抽象方法与虚拟方法的区别

学过C#的人应该都知道抽象方法与虚拟方法,而很多初学者对二者之间的区别并不是很了解.今天本文就来分析一下二者之间的区别.并附上实例加以说明.具体分析如下: 一.主要区别: 对于抽象方法,子类必须实现它 . 对于虚拟方法,子类可以重写也可以不重写 . 因此, 两者约束不同 二.实例代码如下: /* 声明一个抽象类 * 1.抽象类中可以包含变量 * 2.抽象方法中无法声明方法体 */ abstract class AbsClass { string name; public abstract voi

【转】C#虚方法virtual详解

转:https://www.cnblogs.com/zhaoshujie/p/10502404.html 在C++.Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外. 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的函数,其

Activator.CreateInstance 方法 (Type) 的用法

转自:http://www.cnblogs.com/lmfeng/archive/2012/01/30/2331666.html Activator.CreateInstance 方法 (Type) 的用法 Activator.CreateInstance 方法 (Type) 使用与指定参数匹配程度最高的构造函数来创建指定类型的实例. 命名空间:System程序集:mscorlib(在 mscorlib.dll 中) C# public static Object CreateInstance

Oracle 11g 虚拟列 Virtual Column介绍

Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句 2.可以基于虚拟列来做分区 3. 可以在虚拟列上建索引,o

多态,虚拟方法,重写,接口,类库,委托,is,as运算符,泛型集合,万能变量

多态:简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { publ

ORACLE虚拟索引(Virtual Index)

ORACLE虚拟索引(Virtual Index)   虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目的是模拟索引的存在而不用真实的创建一个完整索引.这允许开发者创建虚拟索引来查看相关执行计划而不用等到真实创建完索引才能查看索引对执行计划的影响,并且不会增加存储空间的使用.如果我们观察到优化器生成了一个昂贵的执行计划并且SQL调整指导建议我们对某些的某列创建索引,但在生产数据库环境中创建索引与测试并

关于Jquery中ajax方法data参数用法的总结

jquery手册描述: data 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 processData 选项说明以禁止此自动转换.必须为 Key/Value 格式.如果为数组,jQuery 将自动为不同值对应同一个名称.如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'. 示例: $.ajax({    type: "POST",    u