【C++】多态 ⑥ ( 函数重定义涉及的问题 - 子类覆盖父类函数名 )





一、函数重定义涉及的问题




1、执行出错的代码


错误代码示例 :

#include "iostream"
using namespace std;

// 父类
class Parent {
   
public:
	void fun(int a, int b, int c)
	{
   
		cout << "执行 父类 void fun(int a, int b, int c) 函数" << endl;
	}

	void fun(int a, int b)
	{
   
		cout << "执行 父类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
   
		cout << "执行 父类 void fun(int a) 函数" << endl;
	}
};

// 子类
class Child : public Parent {
   
public:
	void fun(int a, int b)
	{
   
		cout << "执行 子类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
   
		cout << "执行 子类 void fun(int a) 函数" << endl;
	}
};


int main() {
   

	Child c;
	c.fun(1, 2, 3);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

报错信息 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(41,15): error C2661: “Child::fun”: 没有重载函数接受 3 个参数
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

在这里插入图片描述


2、代码分析


在 Parent 父类 中 , 定义了如下 3 个函数 ,

	void fun(int a, int b, int c)
	void fun(int a, int b)
	void fun(int a)

在 Child 子类中 , 重定义了上述 3 个函数中的 2 个函数 ,

	void fun(int a, int b)
	void fun(int a)

注意 : 是重定义 , 不是重写 ; 重写 需要 为 父类 函数添加 virtual 关键字修饰 , 会有多态效果 ;

重定义 时 , 子类 会 覆盖 父类 的 函数名称 ;


执行

	Child c;
	c.fun(1, 2, 3);

代码 , 尝试调用 父类的 3 个参数的 fun 函数 , 出现错误 ,

报错 : error C2661: “Child::fun”: 没有重载函数接受 3 个参数 ;


该错误是编译阶段报的错误 , 编译根本通不过 ;


3、错误原因分析 - 函数重定义问题 : 子类覆盖父类函数名


错误原因分析 : 函数重定义 带来的问题 , 子类覆盖父类函数名 ;

函数重定义的函数名称覆盖问题 : C++ 编译器 发现 Child c 对象要调用 void fun(int a, int b, int c) 函数 , 子类中已经存在 fun 函数了 , 子类 会 覆盖 父类的函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去父类 查找 ;

子类查找函数 : C++ 编译器 在 子类中找到了 void fun(int a, int b) 和 void fun(int a) 两个函数 , 没有找到 3 个参数的函数 , 此时 C++ 编译器会报错 :

error C2661: “Child::fun”: 没有重载函数接受 3 个参数 ; 

4、正确调用函数的方法


在这种情况下 , 由于子类 重定义了部分 父类的重载函数 , 导致 父类的 函数名被覆盖 , 此时需要使用 域操作符 访问父类 被覆盖的函数 ;

	Child c;
	c.Parent::fun(1, 2, 3);

代码示例 :

#include "iostream"
using namespace std;

// 父类
class Parent {
   
public:
	void fun(int a, int b, int c)
	{
   
		cout << "执行 父类 void fun(int a, int b, int c) 函数" << endl;
	}

	void fun(int a, int b)
	{
   
		cout << "执行 父类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
   
		cout << "执行 父类 void fun(int a) 函数" << endl;
	}
};

// 子类
class Child : public Parent {
   
public:
	void fun(int a, int b)
	{
   
		cout << "执行 子类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
   
		cout << "执行 子类 void fun(int a) 函数" << endl;
	}
};


int main() {
   

	Child c;
	c.Parent::fun(1, 2, 3);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

执行 父类 void fun(int a, int b, int c) 函数
Press any key to continue . . .

在这里插入图片描述

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 08:30:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 08:30:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 08:30:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 08:30:02       20 阅读

热门阅读

  1. Android 消息分发机制解读

    2023-12-07 08:30:02       28 阅读
  2. html css样式选择器介绍

    2023-12-07 08:30:02       39 阅读
  3. vue 学习 -- day39(reactive 对比 ref)

    2023-12-07 08:30:02       36 阅读
  4. 一个小问题

    2023-12-07 08:30:02       37 阅读
  5. CSS 如何居中 DIV

    2023-12-07 08:30:02       41 阅读
  6. C++之链表list

    2023-12-07 08:30:02       28 阅读
  7. Flink基础之DataStream API

    2023-12-07 08:30:02       31 阅读
  8. Android App-targetSDKVersion28升级为30

    2023-12-07 08:30:02       37 阅读
  9. Python大数据之Python进阶(六)多线程的使用

    2023-12-07 08:30:02       41 阅读