多态以及原理

1.Java多态概述


Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但可具有不同的参数列表、返回值类型。调用方法时通过传递的参数类型来决定具体使用哪个方法,这就是多态性。

Java的方法重写,是父类与子类之间的多态性,子类可继承父类中的方法,但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。重写的参数列表和返回类型均不可修改。


2.方法重写后的动态绑定

多态允许具体访问时实现方法的动态绑定。Java对于动态绑定的实现主要依赖于方法表,通过继承和接口的多态实现有所不同。

继承:在执行某个方法时,在方法区中找到该类的方法表,再确认该方法在方法表中的偏移量,找到该方法后如果被重写则直接调用,否则认为没有重写父类该方法,这时会按照继承关系搜索父类的方法表中该偏移量对应的方法。 

接口:Java 允许一个类实现多个接口,从某种意义上来说相当于多继承,这样同一个接口的的方法在不同类方法表中的位置就可能不一样了。所以不能通过偏移量的方法,而是通过搜索完整的方法表。

### 多态原理总结 #### 虚函数表的作用 在 C++ 中,多态的核心机制依赖于 **虚函数表 (vtable)** 的实现。当一个类声明了一个 `virtual` 函数时,编译器会在该类中创建一张虚拟函数表,用于存储指向虚函数的指针[^1]。对于每一个派生类,如果重写了基类中的某个虚函数,则其 vtable 将更新为指向新的实现。 以下是关于虚函数表的一个例子: ```cpp class Base { public: virtual void Func1() { cout << "Base::Func1()" << endl; } private: int _b = 1; }; // sizeof(Base) 是多少? ``` 在此代码片段中,由于存在虚函数 `Func1()`,因此即使 `_b` 占用了内存空间,`sizeof(Base)` 还需额外考虑 vptr(虚函数指针)的空间占用[^1]。通常情况下,在大多数平台上,`sizeof(Base)` 等于 `_b` 所占字节加上 vptr 的大小。 --- #### 动态绑定与静态绑定的区别 动态绑定是多态的关键特性之一。它允许程序在运行时决定调用哪个版本的方法,而不是像静态绑定那样在编译期就已固定下来。通过使用引用或指针访问对象时,实际执行的行为取决于对象的真实类型而非变量的声明类型[^3]。 例如: ```cpp #include <iostream> using namespace std; class Person { public: virtual void BuyTicket() { cout << "普通人:买票-全价" << endl; } }; class Student : public Person { public: virtual void BuyTicket() override { cout << "学生:买票-半价" << endl; } }; void func(Person& tmp) { tmp.BuyTicket(); } int main() { Person p; Student s; func(p); // 输出:“普通人:买票-全价” func(s); // 输出:“学生:买票-半价” return 0; } ``` 在这个示例中,尽管参数被定义为 `Person&` 类型,但由于传入的对象分别是 `p` 和 `s`,所以最终调用的具体方法由它们的实际类型决定——这就是典型的动态绑定过程[^3]。 --- #### 面向对象设计中的意义 多态使得软件开发更加灵活且易于扩展。借助这一特性,开发者能够编写通用性强、可维护性高的代码结构。比如可以通过定义一系列具有共同接口的基础类及其子类来构建复杂的应用逻辑;而在不改变原有架构的前提下新增功能只需增加相应的派生类即可完成操作定制化处理[^4]。 综上所述,C++ 中的多态主要基于以下几点实现: 1. 使用关键字 `virtual` 声明成员函数; 2. 利用运行时期间形成的虚函数表来进行间接寻址; 3. 结合继承关系形成层次化的解决方案框架。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值