【C++】虚函数和重载函数的区别

  1. 范围:成员函数被重载需要在相同的范围(同一个类),而虚函数要求在不同的范围(一个在派生类,一个在基类);
  2. 形式:重载函数要求函数有相同函数名,并且参数序列要不同,而虚函数要求函数名、返回值类型和参数序列完全相同;
  3. 类型:重载函数可以是成员函数或者友元函数,而虚函数只能是成员函数;
  4. 依据:重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据,而虚函数是根据对象的不同去调用不同类的虚函数;
  5. 多态:虚函数在运行时表现出多态功能,这是c++的精髓;而重载函数则在编译时表现出多态性;
### C++虚函数的重写重载区别及使用场景 #### 一、概念区分 1. **虚函数重写** 虚函数重写的前提是基类中的函数被声明为 `virtual`,派生类通过提供新的实现来覆盖基类的行为。这种机制支持运行时多态性,即调用哪个版本的方法取决于对象的实际类型而非引用或指针的静态类型[^1]。 2. **函数重载** 函数重载是指在同一作用域内定义多个同名函数,但这些函数的参数列表(包括数量、顺序或类型)必须有所不同。编译器根据实参匹配最合适的函数版本进行调用[^4]。 --- #### 二、语法特性对比 ##### 1. **虚函数重写** - 基类中需显式声明该方法为虚拟 (`virtual`)。 - 派生类可以重新定义此方法,且签名应完全一致(除了返回值可扩展至协变类型外)。 - 如果希望强制要求子类实现某个虚函数,则可以在基类将其设置为纯虚函数形式:`virtual ReturnType FunctionName(...) = 0;`。 - 示例代码如下: ```cpp class Animal { public: virtual void Speak() const { std::cout << "Animal speaks." << std::endl; } }; class Dog : public Animal { public: void Speak() const override { std::cout << "Dog barks!" << std::endl; } // 重写了Speak() }; ``` 上述例子展示了如何利用虚函数达到动态绑定的效果。 ##### 2. **函数重载** - 不涉及继承关系;通常发生在同一个类内部或者全局命名空间下。 - 主要依赖于不同的形参配置来进行区分。 - 下面是一个简单的加法运算符重载案例展示: ```cpp class Calculator { public: int add(int a, int b) { return a + b; } // 整数相加 double add(double a, double b) { return a + b; } // 浮点数相加 }; ``` 这里体现了基于数据类型的函数重载应用实例。 --- #### 三、内存布局影响分析 当一个类含有至少一个虚函数时,它会被赋予一张所谓的“虚函数表”(vtable),用来记录各个虚函数入口地址的信息。即使没有任何其他成员变量存在,此类大小也不会缩减到零字节长度,因为它需要保存指向 vptr 的额外字段用于管理这个表格结构[^3]。 考虑下面这段测试程序及其输出结果解释了这一点: ```cpp #include <iostream> using namespace std; class Base { public: virtual void f(){} private: int m_data; }; int main(){ cout<< sizeof(Base)<< endl; // 输出可能为8,在某些平台上可能是4加上指针宽度 } ``` 这是因为尽管只定义了一个整型成员m_data以及单个虚函数f(),但由于引入了vtable机制的缘故,最终计算得出的整体尺寸大于单纯的数据部分所占的空间需求量[^2]. --- #### 四、适用场合建议 对于追求灵活性并打算构建复杂的面向对象体系架构的应用开发人员来说,“虚函数”的运用显得尤为重要,尤其是在处理那些具有层次化特征的对象模型之时。“函数重载”,则更多适用于简化接口设计方面的工作,使得相同的逻辑操作能够适应多种输入条件下的情形。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿峰不想搬砖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值