761棋牌_761棋牌app下载_761棋牌游戏中心大厅

761棋牌加入了众多的创新玩法,所以说在选择娱乐天体验的时候你一定要相信761棋牌,一定会给大家提供最好的娱乐享受,因为现在的名气很大。

By

C++ 中类的函数重载(overload)、函数重写(override)、虚函数重写(virtual override)、虚函数重载(virtual overload)区别

前言

图片来自:https://www.geeksforgeeks.org/c-plus-plus/

重载和重写都是对同名函数的处理,区别是处理的同名函数参数类型、个数、返回值是否完全一样。

  • 重载(overload):定义多个同名函数,这些同名函数的参数类型、个数、返回值可以不一样。
  • 重写(override):存在于子父类之间,在子类中重新定义从父类继承的同名函数(参数类型、返回值要求完全一样)

函数重载(overload)

class A{    // 定义父类 A
public:
    void foo(){
        cout<<"A::foo()"<<endl;
    }
};
class B:public A{   // 子类B从父类A继承而来
public:
    void foo(int x){    // 函数重载,定义了一个和父类A中同名的函数,但是类型不同
        cout<<"B::foo(int "<<x<<")"<<endl;
    }
};
int main(){
    B* b = new B;
    b->foo();   // 编译错误,在B类中找不到函数foo(void),因为编译器不会跨域重载,需要声明 using A::foo
    b->foo(5);  // 输出:B::foo(5)
    return 0;
}

函数重写(override)

class A{    // 定义父类 A
public:
    void foo(){
        cout<<"A::foo()"<<endl;
    }
};
class B:public A{   // 子类B从父类A继承而来
public:
    void foo(){     // 函数重写,重写了从父类A继承来的同名函数,类型完全一样
        cout<<"B::foo()"<<endl;
    }
};
int main(){
    B* b = new B;
    b->foo();   // 输出:B::foo()
    return 0;
}

虚函数重写(virtual override)

虚函数(virtual)核心理念就是通过父类访问子类中定义的函数,借此实现C++的“多态性”,见下面的例子。

class A{    // 定义父类 A
public:
    virtual void foo(){
        cout<<"A::foo()"<<endl;
    }
};
class B:public A{   // 子类B从父类A继承而来
public:
    void foo(){     // 虚函数重写,虽然没加 virtual 关键字,但它还是虚函数
        cout<<"B::foo()"<<endl;
    }
};
int main(){
    A* a = new B;
    a->foo();   // 输出:B::foo()。在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
    return 0;
}

这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。

看下一个例子对多态的理解可能更透彻:

void bar(A* a){
    a->foo(); // 被调用的是A::foo()还是B::foo()?
}
int main(){
    A* a = new A;
    A* b = new B;
    bar(a); // 输出:A::foo()
    bar(b); // 输出:B::foo()
    return 0;
}

虚函数重载(virtual overload)

虚函数重载应该尽量避免,因为在子类中重载和父类中同名但是类型不同的虚函数,会使父类中 virtual 失效,子类中的就不再是虚函数,父类中的虚函数也无法跨域访问,多态性无法表现出来。

一些概念

  • 纯虚函数:后面加了 =0 的虚函数,纯虚函数没有实现;
  • 抽象类:包含了纯虚函数的类叫做抽象类,抽象类不能创建实例(new),需要由子类将它实现之后,才能创建实例。抽象类也就是所谓的“接口”。

参考

  • C++中重载与重写函数区别及虚函数
    https://blog.csdn.net/qq_37668377/article/details/81007527
  • C++ 子类不能重载父类函数 解决方法
    https://www.jianshu.com/p/34ba593dd6a4
  • C++中的虚函数重载
    https://blog.csdn.net/ly890700/article/details/55803398
  • 当心虚函数重载(overloaded-virtual)
    http://www.cppblog.com/jinq0123/archive/2009/05/22/85378.html
  • 重载与重写的区别
    https://www.cnblogs.com/upcwanghaibo/p/6527354.html
  • C++中const 关键字的用法
    https://www.cnblogs.com/chenny7/p/4418926.html
  • C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
    https://www.cnblogs.com/xudong-bupt/p/3570304.html

原创声明

转载请注明:呓语 » C++ 中类的函数重载(overload)、函数重写(override)、虚函数重写(virtual override)、虚函数重载(virtual overload)的区别