首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Base Delphi接口不能以多态方式工作

是因为Delphi语言的接口是基于引用计数的,而不是基于虚函数表的。在Delphi中,接口是通过引用计数来管理内存的,当一个接口变量引用一个对象时,引用计数会加1,当接口变量不再引用该对象时,引用计数会减1,当引用计数为0时,对象会被自动释放。这种引用计数的机制导致了接口不能以多态方式工作。

在Delphi中,接口的实现类必须显式地实现接口中定义的所有方法,而不能通过继承的方式来实现多态。这意味着如果一个接口变量引用一个实现类的实例,那么该接口变量只能调用实现类中显式实现的方法,而不能调用实现类的子类中重写的方法。

然而,Delphi中的类可以通过继承和虚函数来实现多态。通过定义一个基类,并在基类中声明虚函数,然后在派生类中重写这些虚函数,就可以实现多态。在使用多态时,可以通过基类的指针或引用来调用派生类中重写的方法。

总结起来,Base Delphi接口不能以多态方式工作是因为Delphi语言的接口是基于引用计数的,而不是基于虚函数表的。如果需要实现多态,可以使用类的继承和虚函数来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

D语言的陷阱

D语言采用单根+接口的继承机制。在多态上主要使用虚方法表和多接口来实现,而数据封装则主要通过它的attributes。  OK,下面我们先来看下D语言attributes语法层面上的小陷阱。 ...当然,对于1和3的声明方式,我们都很容易理解。但是第2种声明方式,我就犯迷糊了。我们不论在phobos还是tango库都可以找到大量的类似声明。...俺推荐。...";} } 最后,我们来看下D语言的多态。D语言实现多态主要是通过虚方法调用和多接口继承。此外,抽象类的使用也是实现多态的重要途径之一。多态问题非常复杂,很难一下说清楚。...接口既是表达多态的手段,也是实现契约编程的手段。接口实际上只是为一组方法签名指定一个名称的方式。这些方法根本不带任何实现。但是继承接口与继承父类截然不同。

57710

C++多态

概念认知 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。...引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4...实现方式就是子类根据自身需要更改了从父类继承的方法。 2. 基本语法 C++支持多种多态,从实现形式上概括,有虚函数、重载等。从绑定时间,分为静态多态和动态多态,又称为编译期多态和运行期多态。...: 整数为: 5 浮点数为: 500.263 字符串为: Hello C++ 重载方式: 整数为: 5 浮点数为: 3.141 字符串为: Hello world 动态多态(继承): #include...当函数有virtual声明时,就成为虚函数,其作用类似于备胎,当作用域有同名函数时,会执行同名函数执行虚函数,否则会执行虚函数。 3 拓展延伸 问题:利用多态实现正方形与圆形的面积计算。

34910

重温Delphi之:面向对象

任何一门语言,只要具备了"封装,继承,多态"这三项基本能力,不管其实现方式是直接或曲折、复杂或简洁,就可以称之为“面向对象”的语言。 Delphi当年的迅速走红,是以其RAD快速开发吸引程序员的目光。...这无疑是它最吸引人的优势,但同时也让人误以为delphi只是vb的高级版本,从而忽视了其面向对象的特性。...其实Pacscal发展到Delphi,已经完全具备了面向对象的所有特点:允许自定义类,类可以继承(单继承),允许方法重载/覆写,可以定义接口,类可以实现接口,允许定义静态方法(即class方法),虚方法...,抽象类...等等,对于delphi怀有偏见的朋友,你还会怀疑delphi的面向对象能力吗?...注意,TWoman这个子类实现了接口ICook,其定义如下: 4.ICook接口 unit UICook; interface type   ICook = interface //定义一个接口

69360

什么是多态

理想二旬不止@BWH_Steven 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。...引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 —— Delphi4...格式: parent p = new Chile(); 把子的对象赋值给父 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。...当后面学习了接口、集合框架等内容,就会经常见到它。...多态的好处和弊端 4.1 好处 提高了代码的维护性(因为继承会导致代码有明确的结构和关系,不过继承会让耦合变高,后面会使用组合等方式) 提高了代码的扩展性(由多态保证) 提升扩展性是一个很重要的优点,下面就举个例子

99910

如何使用Go语言写出面向对象风格的代码

Go语言可以通过 type 关键字创建新的类型,所以我们为了暴露一些属性和方法,可以采用创建一个新类型的方式,自己手写构造器的方式实现封装,举个例子: type IdCard string func...继承 Go并没有原生级别的继承支持,不过我们可以使用组合的方式来实现继承,通过结构体内嵌类型的方式实现继承,典型的应用是内嵌匿名结构体类型和内嵌匿名接口类型,这两种方式还有点细微差别: 内嵌匿名结构体类型...:将父结构体嵌入到子结构体中,子结构体拥有父结构体的属性和方法,但是这种方式不能支持参数多态。...内嵌匿名接口类型:将接口类型嵌入到结构体中,该结构体默认实现了该接口的所有方法,该结构体也可以对这些方法进行重写,这种方式可以支持参数多态,这里要注意一个点是如果嵌入类型没有实现所有接口方法,会引起编译时未被发现的运行错误...多态 多态是面向对象编程的本质,多态是支代码可以根据类型的具体实现采取不同行为的能力,在Go语言中任何用户定义的类型都可以实现任何接口,所以通过不同实体类型对接口值方法的调用就是多态,举个例子: type

32220

2023 年 30 个 OOP 面试问题和答案

什么是多态性? “多态性”一词意味着具有许多形式。它是某些代码根据不同的上下文而表现出不同行为的属性。例如,在C++语言中,我们可以定义具有相同名称但根据上下文而有不同工作方式的多个函数。...在这种情况下,该方法以动态方式工作,根据代码的需要进行调用一段时间。 修改和更新代码更容易。 修改代码相对于面向对象编程来说是困难的。 数据在面向对象编程中更加重要。 代码被赋予更多的重要性。...名为重载的编译时多态特征允许一个实体具有相同名称但不同实现方式的众多版本。方法重载和操作符重载都是两个例子。 覆盖是一种形式的运行时多态,在其中以相同名称但不同实现方式执行一个实体。...抽象类和接口都是特殊类型的类,它们只包含方法的声明而包含实现。尽管如此,抽象类与接口完全不同。...一个纯虚函数,也被称为抽象函数,是一个包含任何语句的成员函数。如果需要,这个函数会在派生类中进行定义。

24930

今年的面试太难了?2023 年 30 个 OOP 面试问题和答案也许可以帮到你

什么是多态性? “多态性”一词意味着具有许多形式。它是某些代码根据不同的上下文而表现出不同行为的属性。例如,在C++语言中,我们可以定义具有相同名称但根据上下文而有不同工作方式的多个函数。...在这种情况下,该方法以动态方式工作,根据代码的需要进行调用一段时间。 修改和更新代码更容易。 修改代码相对于面向对象编程来说是困难的。 数据在面向对象编程中更加重要。 代码被赋予更多的重要性。...名为重载的编译时多态特征允许一个实体具有相同名称但不同实现方式的众多版本。方法重载和操作符重载都是两个例子。 覆盖是一种形式的运行时多态,在其中以相同名称但不同实现方式执行一个实体。...抽象类和接口都是特殊类型的类,它们只包含方法的声明而包含实现。尽管如此,抽象类与接口完全不同。...一个纯虚函数,也被称为抽象函数,是一个包含任何语句的成员函数。如果需要,这个函数会在派生类中进行定义。

28341

C++进阶-多态

如果基类的虚函数不加virtual,派生类的虚函数加virtual,这种情况是构成虚函数的 析构函数的重写 我们知道,基类指针和引用可以指向基类和派生对象,由此通过指针和引用释放对象时需要实现析构的多态...: 普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现 虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口(...如果不实现多态,不要把函数定义成虚函数) 注意: 虽然函数重写需要接口一样,但是对于参数的缺省值没有检查,如果基类虚函数和派生类重写函数的缺省值不同,按照基类虚函数的接口来走,也就是说不用管派生类重写函数的接口...四、多态的原理 1、虚函数表 例题: // 这里常考一道笔试题:sizeof(Base)是多少?...不能,因为静态成员函数没有this指针,不能通过对象指针找到其虚函数表,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表 构造函数可以是虚函数吗?

55330

多态

// 实现方法2 typedef void (*Func)(void*); struct Base { Func f; }; struct T1 { struct Base base...+) { arr[i]->f(arr[i]); } 可以看到方法2比方法1看上去简洁了很多,实现方式更加优雅,易于维护而且拓展性更好,如果需要增加其他功能的话,只需要在struct Base中添加一个函数指针即可...实际上这种方式就有点类似c++实现动态多态方式,结合了面向对象思想,使数据与行为连接在一起。 这里函数指针的使用可以同时看做变量多态或函数多态,区别只在于把它当做变量还是函数。...这就是一种多态在多实例管理上的应用。 抽象接口类 提供抽象的接口,运行时引用具体的实例。 传统的在头文件中声明类的方式或多或少暴露了一些实现细节,尤其是私有函数和成员变量。...实际上这两种都是多态接口类的应用,一种是为了做通用的组织和管理,另一种是为了屏蔽接口实现。所以说多态适用于任何需要通用接口(类型接口或函数接口)的场景。

50780

【C++修炼之路】16.C++多态

2.6 C++11 override 和 final 三.抽象类 3.1 概念 3.2 接口继承和实现继承 3.3 场景问题1 3.2 场景问题2 四.多态的原理 4.1 虚函数表 4.2 多态的原理...如果只是普通的类,那没什么好说的,直接写出成员函数就行了,名字相同也互相影响,但在学了继承之后,我们知道一旦基类和派生类的函数同名,基类的函数就会被隐藏,这样就无法具体出多态的要求,因此下面会通过虚函数来解决这个问题...虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。...3.3 场景问题1 顾名思义,我们已经知道重写是将基类的接口拿来,然后将派生类的内容覆盖,也就是说函数名是属于基类的(这也说明了派生类可以写virtual的原因),那参数需不需要重写?...如果按照理论忽略inline的功能,我们知道inline是使函数在类中展开,即将代码保存在类中,但我们知道这样就与虚函数的功能相违背,因为虚函数是放在虚表中的,二者功能矛盾,就实例来说,在一个继承的虚函数也就是多态

46000

【C++】多态

虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口,重写的是实现。所以如果不实现多态,不要把函数定义成虚函数。...D 选项了,但是 D 是错误的,因为在多态调用中,虚函数的继承是接口继承,重写只是重写实现,所以 B 中 func 函数的接口应该使用从 A 中继承下来的接口,即 val 的缺省值为 1;至此,答案选...endl; } void Func3() { cout << "Func3()" << endl; } private: int _b = 1; char _c = 'a'; }; 如果没学多态或者学的扎实的同学看到这道题会心想...3、菱形继承、菱形虚拟继承的虚表 在上一节继承中我们就提到,实际中我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样的模型,访问基类成员有一定得性能损耗;实际上研究菱形继承和菱形虚拟继承在实际工作中是几乎没有意义的...-- 不能,因为静态成员没有 this 指针,而虚函数要通过虚表调用,虚表要通过对象中的虚表指针来查找,无法使用类型::成员函数的调用方式直接访问虚表。 构造函数可以是虚函数吗?

43700

三大特性之多态

只有它们所指向内存的大小和解释方式 而已”。 对于上述话可以这样理解: 指针和引用类型只是要求了基地址和这种指针所指对象的内存大小,与对象的类型无关,相当于把指向的内存解释成指针或引用的类型。...有了多态以后在调用函数的时候首先要看该函数是否构成多态,如果构成多态那么就不用考虑类型,只需要看该变量中存放的是何种对象,按照对象去调用函数;如果构成多态,那么就只看类型,无论该变量中存的是何对象都不影响...纯虚函数规范了子类必须重写,此外纯虚函数更体现了接口继承。...虚函数的继承是一种接口继承,子类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数 。...答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

15320

C++从入门到精通(第九篇) :多态

endl; } /*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继 承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,建议这样使用...虚函数的 继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所 以如果不实现多态,不要把函数定义成虚函数。...四:多态的原理 引入: 这里常考一道笔试题:sizeof(Base)是多少?...)));//先转为char*步长便于越过Base1类去拿到Base2的地址 PrintVTable(vTableb2); return 0; } 五:继承和多态常见的面试问题 什么是多态...答:不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式 无法访问虚函数表,所以静态成员函数无法放进虚函数表。 构造函数可以是虚函数吗?

43430

【C++】三大特性之多态

,是在继承方式前加上 virtual 。...纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。 2.接口继承和实现继承 普通函数的继承是一种 实现继承 ,派生类继承了基类函数,可以使用函数,继承的是函数的实 现。...虚函数的继承是一种 接口继承 ,派生类继承的是基类虚函数的接口,目的是为了重写,达成 多态,继承的是接口。 所以如果不实现多态,不要把函数定义成虚函数。...---- 四、多态的原理 1.虚函数表 这里常考一道笔试题:sizeof(Base)是多少?...菱形继承、菱形虚拟继承 实际中我们建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样的 模型,访问基类成员有一定得性能损耗。

67750

【C++】多态

override用于检测虚函数是否重写,如果并未重写则会发生报错,比如有的时候我们在重写虚函数时,不小心多加了个参数,或者函数名少写了一个字母等等,就会导致虚函数未完成重写的工作,此时override就会编译报错...下面我们来看一道题,加深对于接口继承和多态调用的理解。...(其实如果从底层角度来看的话,多态调用和普通调用走的路子不一样,导致使用的虚函数接口也不一样,如果是多态调用,则先去虚表里找到func地址,然后根据地址到代码段里面拿到对应的func虚函数,这个虚函数的接口用的是基类接口...如果是普通调用,则发生静态绑定,直接去代码段里面拿func,但这个func的接口用的是派生类重写虚函数之后的接口,实现肯定和多态调用调到的func是一致的。...这种方式较为繁琐,另一种方式就是利用切片赋值,我们直接让Base2类型指针指向派生类对象即可,这样默认的Base2类型指针指向的就是派生类中Base2的基类成员,这个时候只要取得指针的前4个字节,就可以取到第二张虚表的地址了

49120

JAVA基础(38) java四大特性理解(封装、继承、多态、抽象)

多态的定义:     指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。...例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2.可扩充性(extensibility)。          多态对代码具有可扩充性。...3.接口性(interface-ability)。 多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。 4.灵活性(flexibility)。...Java中多态的实现方式接口实现,继承父类进行方法重写,同一个类中进行方法重载。 多态的理解: 1、多态(Polymorphism)是面向对象的三大特征之一。...4、结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍 然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个

1.6K20

【C++】继承和多态

使用关键字 class 时默认的继承方式是 private,使用 struct 时默认的继承方式是 public,不过最好显示的写出继承方式。...如果在父类中没有加上 virtual 即析构函数构成多态,当下面这种情景时,不能正确调用析构函数: // 析构函数构成多态 class Person { public:...cout << "~Student()" << endl; } }; 如上图,当我们 new 的是一个子类对象,将它赋值兼容给父类,会发生切片操作,此时我们释放 p 指针,由于析构函数构成多态...虚函数的继承是一种接口继承,子类继承的是父类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。 4....(2)多态的原理 有了上面的基础,我们就可以分析一下多态的原理了; 首先我们有以下两个类实现的多态: class Base { public: virtual void Func1

11510

【C++】多态——实现、重写、抽象类、多态原理

重定义(隐藏):两个函数分别在基类和派生类的作用域,同时,函数名相同,如果两个基类和派生类的同名函数构成重写那就是重定义!...虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。...,此时this指向的是子类对象,同时根据接口继承,完成重写,用的是父类的接口,缺省值用的是父类的,所以是1. 2.sizeof(Base)是多少?...不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表。 3.构造函数可以是虚函数吗?...6.不要把虚函数表和虚基表搞混了:在多态中,虚函数表是存放虚函数的地址。在继承中,虚基表存储偏移量,解决菱形继承中的代码冗余与二义性 7.抽象类强制重写了虚函数,另外抽象类体现出了接口继承关系

31530

C++【多态

---- 前言 多态 是面向对象三大基本特征中的最后一个,多态 可以实现 “一个接口,多种方法”,比如父子类中的同名方法,在增加了多态后,调用同名函数时,可以根据不同的对象(父类对象或子类对象)调用属于自己的函数...,实现不同的方法,因此 多态 的实现依赖于 继承 同一个售票地点,为不同的购票方式提供了不同的取票窗口(多种状态 -> 多态) ---- ️正文 1、多态基本概念 在使用多态的代码中,不同对象完成同一件事会产生不同的结果...为了构成多态,确保不同对象的析构函数能被成功调用,避免内存泄漏 建议:例外一会破坏代码的可阅读性,可能无法让别人一眼看出多态,因此除了析构函数外,推荐在子类虚函数中省略 virtual 例外二:协变...,这正是实现多态的基础 普通继承:子类可以直接使用父类中的函数 接口继承:子类虚函数继承父类虚函数的接口,进行重写,构成多态 建议:假如不是为了多态,那么最好不要使用 virtual 修饰函数,更不要尝试定义纯虚函数...,是因为调用方式不同,后继承类中的虚表需要通过 this 指针修正的方式调用虚函数 5.3、菱形继承多态与菱形虚拟继承多态(了解) 菱形继承问题是 C++ 多继承中的大坑,为了解决菱形继承问题,提出了

10730
领券