比如
TA = Class
public
procedure A;
procedure B; virtual;
procedure C; virtual; abstract;
end;implementation
procedure TA.A;
begin
B;
C;
end;// 主程序
AA : TA;
AA.A;// 因为调用了虚函数,会不会出错,运行是的效果是什么?谢谢!对虚函数的这个概念比较模糊,谢谢!
TA = Class
public
procedure A;
procedure B; virtual;
procedure C; virtual; abstract;
end;implementation
procedure TA.A;
begin
B;
C;
end;// 主程序
AA : TA;
AA.A;// 因为调用了虚函数,会不会出错,运行是的效果是什么?谢谢!对虚函数的这个概念比较模糊,谢谢!
解决方案 »
- 我想在数据库access中动态的创建数据表,同时以日期时间为数据表的名字
- 关于变量、函数等:用全局变量、函数好 还是 成员变量、方法比较好?
- 急,求高手指点
- Memo控件的显示问题?
- Delphi調用水晶報表出錯,來看看﹐在線等
- 非常简单的问题,如何访问指定纪录的下一条呀。
- Access 是不是不支持一次删除多行数据呀
- 有点难度的问题,高手请进来~~
- wps/word式的MDI界面怎样设计? 难道没人能解决这个问题吗?
- 代码大全中文电子版在4个月来近100位网友出色的志愿工作下终于诞生了 ! !
- CSDN不成文的规定...... 散分200......
- DevExpress.ExpressQuantumGrid.Suite这个控件很好,大家都用什么版本的?
否则在调用TA.A时会出错.创建TA类的子类. 再到子类中实现procedure C; override;再实例化子类. 这时可以引用A过程了.
abstract: 定义纯虚函数,不许实现的函数;我的问题是,在基类中,纯虚函数是不是不可以被调用
谢谢!
private
m_FileName : String;
protected
procedure DoLoadFromFile(FileName : String); virtual; abstract;
public
procedure LoadFromFile(FileName : String);
end;procedure TssnEditor.LoadFromFile(FileName: String);
begin
m_FileName := FileName;
// 实际读取文件到编辑器的动作,延迟到派生类中实现
// 因此DoLoadFromFile为virtual; abstract;的
// 如果FileName = '',表示新建一个编辑器组件,不打开任何文件
if FileName <> '' then
DoLoadFromFile(FileName);
end;这种做法也是设计模式的一种,被称为“Template Method”,它的应用非常普遍。在VCL中,TObject非虚的Free()方法和虚方法Destroy()之间的关系,就如同LoadFromFile()和DoLoadFromFile()的关系一样。这又是如何理解呢?
DoLoadFromFile(FileName);它是调用了子类的实现.
并不是调用它本身这个类的过程.不然, 你可以创建一个TssnEditor的对象. 再调用这个过程, 你看会不会出错.也就是说. 如果在要用到纯虚函数的地方, 它的前提是, 必须在子类中进行了重载并实现.
abstract: 定义纯虚函数,不许实现的函数;我的问题是,在基类中,纯虚函数是不是不可以被调用
纯虚函数可以被基类调用
对于纯虚函数,是可以在基类中调用的,但是声明了纯虚函数的类,一般不实例化,不直接使用基类,而是使用其子类。
如:
TA如楼主所声明,再声明TBClass=class(TA),在TBClass中override C方法。
在使用中:
var
BClass:TA;
begin
BClass:=TBClass.Create;
BClass.A;
end;
这样就不会出错。如果直接使用TA.Create,应该是会出错。
只要声明中声明过纯虚函数,那么该类不能实例化,只能做基类.
所有派生它的类,如果不实现这个纯虚函数,那么也不能实例化.
在这些不能实例化的类里面是可以用到这些纯虚类的(因为没有实例化的不可能执行,如果能实例化了,则肯定已经override了这个纯虚类).
在使用中:TBClass=class(TA),
public
procedure c;override;
end;var
BClass:TBClass;
begin
BClass:=TBClass.Create;
BClass.A;
end;
public
procedure c;override;
end; procedure c;
begin
//你要处理的事情...
//父类TA的C 虚过程里是没有内容的 end;
var
BClass:TBClass;
begin
BClass:=TBClass.Create;
BClass.A;
end;
在Delphi中可以建立含有抽象对象方法的对象,但是编译的时候会发出警告消息。如果运行时调用了抽象方法,程序异常。