比如
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;// 因为调用了虚函数,会不会出错,运行是的效果是什么?谢谢!对虚函数的这个概念比较模糊,谢谢!

解决方案 »

  1.   

    不会出错.但是你不能创建TA的实例.
    否则在调用TA.A时会出错.创建TA类的子类. 再到子类中实现procedure C; override;再实例化子类. 这时可以引用A过程了.
      

  2.   

    先去看看 virtual以及abstract的意义
      

  3.   

    virtual:定义虚函数,实现面对对象的多态性;
    abstract: 定义纯虚函数,不许实现的函数;我的问题是,在基类中,纯虚函数是不是不可以被调用
     
    谢谢!
      

  4.   

    纯虚函数不可以被调用,在子类中去实现该方法,override
      

  5.   

    只有子类override后,在子类对象中才可用,有了它就有了多态。
      

  6.   

    谢谢!但是看看这个模式,这是从‘Delphi高手突破’中截取的代码:TssnEditor = class(IssnEditor)
    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()的关系一样。这又是如何理解呢?
      

  7.   

    纯虚函数不可以被调用,在子类中去实现该方法,override
      

  8.   

    其实就是这样理解... if FileName <> '' then
       DoLoadFromFile(FileName);它是调用了子类的实现.
    并不是调用它本身这个类的过程.不然, 你可以创建一个TssnEditor的对象. 再调用这个过程, 你看会不会出错.也就是说. 如果在要用到纯虚函数的地方, 它的前提是, 必须在子类中进行了重载并实现.
      

  9.   

    virtual:定义虚函数,实现面对对象的多态性;
    abstract: 定义纯虚函数,不许实现的函数;我的问题是,在基类中,纯虚函数是不是不可以被调用
     
    纯虚函数可以被基类调用
      

  10.   

    当然会出错。“Abstract Error.”
      

  11.   

    看了上面的贴子,感觉讲的不是很明白,所以回复上本人的理解。
    对于纯虚函数,是可以在基类中调用的,但是声明了纯虚函数的类,一般不实例化,不直接使用基类,而是使用其子类。
    如:
    TA如楼主所声明,再声明TBClass=class(TA),在TBClass中override C方法。
    在使用中:
    var
      BClass:TA;
    begin
      BClass:=TBClass.Create;
      BClass.A;
    end;
    这样就不会出错。如果直接使用TA.Create,应该是会出错。
      

  12.   

    简单点说
     只要声明中声明过纯虚函数,那么该类不能实例化,只能做基类.
     所有派生它的类,如果不实现这个纯虚函数,那么也不能实例化.
     在这些不能实例化的类里面是可以用到这些纯虚类的(因为没有实例化的不可能执行,如果能实例化了,则肯定已经override了这个纯虚类).
      

  13.   

    TA如楼主所声明,再声明TBClass=class(TA),在TBClass中override C方法。
    在使用中:TBClass=class(TA),
      public
        procedure c;override;
      end;var
      BClass:TBClass;
    begin
      BClass:=TBClass.Create;
      BClass.A;
    end;
      

  14.   

    TBClass=class(TA),
      public
        procedure c;override;
      end;  procedure c;
      begin
      //你要处理的事情...
      //父类TA的C 虚过程里是没有内容的  end;
    var
      BClass:TBClass;
    begin
      BClass:=TBClass.Create;
      BClass.A;
    end;
      

  15.   

    察看了 Mastering Delphi7(中文版)59-60页是这么说的:
    在Delphi中可以建立含有抽象对象方法的对象,但是编译的时候会发出警告消息。如果运行时调用了抽象方法,程序异常。