C/C++——C++における関数書き換えと関数リロード


関数の再ロード
1.同じクラスで行う必要があります.2.子は親の関数を再ロードできません.親の同名の関数は名前で上書きされます.3.リロードは、コンパイル中にパラメータタイプと個数に基づいて関数呼び出しを決定します.
親クラスに関数がある場合:
void func()
{
     cout<<"Parent01:void func()"<virtual void func(int i)
{
     cout<<"Parent:void func(int i)"<virtual void func(int i, int j)
{
     cout<<"Parent:void func(int i, int j)"<

サブクラスに関数があります.
void func(int i, int j)
{
     cout<<"Child:void func(int i, int j)"<<" "<void func(int i, int j, int k)
{
     cout<<"Child:void func(int i, int j, int k)"<<" "<

サブクラスChild cを定義します.問題1:c.func();実行できますか?答えはできません.サブクラスは親の関数を再ロードできないため、親の同名関数は名前で上書きされます.サブクラスのfunc(int,int j);およびfunc(int i,int j,int k);親クラスのfunc()関数を上書きしました.親クラスのfunc()関数を呼び出すには、c.Parent 01::func()を実行する必要があります.関数のクラス限定子を付ける.
関数の書き換え
1.親と子の間で発生する必要があります.2.親と子の関数は、完全に同じプロトタイプでなければなりません.3.virtual宣言を使用すると、マルチステートを生成できます(virtualを使用しない場合は、再定義と呼ばれます).4.マルチステートは、実行中に特定のオブジェクトのタイプに応じて関数呼び出しを決定します.
上記の例では、サブクラスのfunc(int,int j);およびfunc(int i,int j,int k);親クラスの2つの関数を書き換えました(この2つの関数は虚関数であるため).
テストケース:
#include 
#include 
using namespace std;

class Parent01
{
public:
    Parent01()
    {
        cout<<"Parent01:printf()..do"<public:
    void func()
    {
        cout<<"Parent01:void func()"<void abcd()
    {
        cout<<"Parent01:void func()"<virtual void func(int i)
    {
        cout<<"Parent:void func(int i)"<virtual void func(int i, int j)
    {
        cout<<"Parent:void func(int i, int j)"<//       
//      ,       virtual   ,       。。。。
//      ,   virtual   ,,          。。。。。,      。。。
class Child01 : public Parent01
{

public:

    //           ,            ,    abcd     。。。
    //    ,           。         ,  。。。。
    void abcd(int a, int b)
    {
        cout<<"Parent01:void func()"<//  2   ,   func       
     void func(int i, int j)
    {
        cout<<"Child:void func(int i, int j)"<<" "<//  3    ,   func       
    void func(int i, int j, int k)
    {
        cout<<"Child:void func(int i, int j, int k)"<<" "<void run01(Parent01* p)
{
    p->func(1, 2);
}

int main()
{
    /*
    Parent01 p;

    p.func();
    p.func(1);
    p.func(1, 2);
    */

    Child01 c;
    //c.Parent01::abcd(); //                  。。。
    //           (             ,          ,          ,   ::)
    //c.Parent01::func(); //  1              ,           
    c.Parent01::func(); //  1
    //c.func(1, 2);
        /*
    run01(&p);
    run01(&c);
    */
    return 0;
}

//  1:child         func,         ?why
//c.func(); 

//1     func         func 
//2             、     ,      
//3//c.Parent::func();
//  2      func       func       ?