29.C++多态 2 (重载,重定义(隐藏),重写 三者的区别)

⭐上篇文章:28.C++多态1 (多态的概念与简单使用,虚函数,final,override)-CSDN博客

⭐标⭐是比较重要的部分

一. 重载

重载是两个函数的名称相同,参数列表不同(顺序,类型,数量不同),这样的两个函数构成重载。

比如:

cpp 复制代码
#include <iostream>
using namespace std;

int test(int a, int b)
{
	return a + b;
}

int test(int a, double b)
{
	return a + b;
}


int main()
{
	return 0;
}

上面的两个test函数构成重载

二. 重定义

重定义是有继承关系的两个类中,父类和子类都有一个同名函数,但是这个同名函数参数列表可能不同,而且没有使用virtual关键字进行修饰。

这两个函数的作用域不同

代码举例:

cpp 复制代码
#include <iostream>
using namespace std;

class A
{
public:
	void test()
	{
		cout << "我是类A" << endl;
	}
};

class B : public A
{
public:
	void test()
	{
		cout << "我是类B" << endl;
	}
};


int main()
{
	A a;
	B b;
	a.test();
	b.test();
	return 0;
}

上面的A类和B类中的test就构成重定义

测试结果如下:

可以看到,对象调用自己类中的test函数

如果使用基类的指针或者引用去引用B类的对象,仍是调用A类的test

代码如下:

cpp 复制代码
#include <iostream>
using namespace std;

class A
{
public:
	void test()
	{
		cout << "我是类A" << endl;
	}
};

class B : public A
{
public:
	void test()
	{
		cout << "我是类B" << endl;
	}
};


int main()
{
	B b;
	A* pa = &b;
	A& a = b;
	pa->test();
	a.test();
	return 0;
}

测试结果如下:

可以看到,都是调用了A类的test 输出了我是类A

三. 重写

成员函数重写是构成多态的两个条件之一,需要使用virtual关键字进行修饰。

重写的两个函数的名称和参数必须相同(协变和析构除外)

重写的两个函数需要使用virtual进行修饰

如下面代码中的两个函数就构成重写

cpp 复制代码
#include <iostream>
using namespace std;

class A
{
public:
	virtual void test()
	{
		cout << "我是类A" << endl;
	}
};

class B : public A
{
public:
	virtual void test()
	{
		cout << "我是类B" << endl;
	}
};


int main()
{
	A* a = new A();
	A* b = new B();
	a->test();
	b->test();
	return 0;
}

测试结果如下:

四.总结

相关推荐
玄同7655 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy87874755 小时前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-19435 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq1982043011565 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class5 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
Jinkxs5 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&5 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
我在人间贩卖青春5 小时前
C++之继承的方式
c++·private·public·protected·继承方式
BD_Marathon5 小时前
设计模式——依赖倒转原则
java·开发语言·设计模式
devmoon6 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡