• 重载重写重定义-易混淆概念-C++编译器处理方式


    1、函数重载

    1)必须在同一个类中进行。

    2)子类无法重载父类的函数,父类同名函数将被名称覆盖

    3)重载是在编译期间根据参数类型和个数决定函数调用

    2、函数重写

    1)必须发生于父类与子类之间

    2)并且父类与子类中的函数必须有完全相同的原型

    3)使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)

    4)多态是在运行期间根据具体对象的类型决定函数调用

    demo

    #include <iostream>
    using namespace std;
    
    //重写 重载 重定义
    //重写发生在2个类之间
    //重载必须在一个类之间
    
    //重写分为2类
    //1 虚函数重写  将发生多态
    //2 非虚函数重写 (重定义)
    
    class Parent
    {
    	//这个三个函数func都是重载关系
    public:
    	
    	virtual void func()
    	{
    		cout << "func() do..." << endl;
    	}
    
    	virtual void func(int i)
    	{
    		cout << "func() do..." << i << endl;
    	}
    
    	virtual void func(int i, int j)
    	{
    		cout << "func() do..." << i << " " << j << endl;
    	}
    
    	virtual void func(int i, int j, int m, int n)
    	{
    		cout << "func() do..." << i << " " << j << endl;
    	}
    
    	void abc()
    	{
    		printf("abc");
    	}
    
    protected:
    private:
    };
    
    
    class Child : public Parent
    {
    
    public:
    	
    	virtual void func(int i, int j)
    	{
    		cout << "func(int i, int j) do..." << i << " " << j << endl;
    	}
    
    	virtual void func(int i, int j, int k)
    	{
    		cout << "func(int i, int j) do.." << endl;
    	}
    
    	void abc()
    	{
    		printf("child abc");
    	}
    	/*
    	void abc(int a)
    	{
    	printf("child abc");
    	}
    	*/
    protected:
    private:
    };
    
    
    //重载重写和重定义
    int main()
    {
    	//: error C2661: “Child::func”: 没有重载函数接受 0 个参数
    	Child c1;
    
    	//c1.func();
    	//子类无法重载父类的函数,父类同名函数将被名称覆盖
    	c1.Parent::func();
    
    	//1 C++编译器看到func名字,因子类中func名字已经存在了(名称覆盖).所以c++编译器不会去找父类的4个参数的func函数
    	//2 c++编译器只会在子类中,查找func函数,找到了两个func,一个是2个参数的,一个是3个参数的.
    	//3 C++编译器开始报错.....  error C2661: “Child::func”: 没有重载函数接受 4 个参数
    	//4 若想调用父类的func,只能加上父类的域名..这样去调用..
    	c1.func(1, 3, 4, 5);
    
    	//c1.func();
    	//func函数的名字,在子类中发生了名称覆盖;子类的函数的名字,占用了父类的函数的名字的位置
    	//因为子类中已经有了func名字的重载形式。
    	//编译器开始在子类中找func函数。。。。但是没有0个参数的func函数 
    
    	return 0;
    }
    



  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    Oracle数据库基础
    软件项目开发模式——三层模式
    JavaWeb——Ajax与MVC学习总结
    JavaWeb——EL及JSTL学习总结
    JavaWeb——过滤器及监听器
    JavaWeb——Servlet开发
  • 原文地址:https://www.cnblogs.com/zhangyaoqi/p/4591568.html
Copyright © 2020-2023  润新知