ホームページ >バックエンド開発 >C++ >C++ 構文エラー: 基本クラスのコンストラクター呼び出しが正しくありません。どのように対処すればよいですか?

C++ 構文エラー: 基本クラスのコンストラクター呼び出しが正しくありません。どのように対処すればよいですか?

王林
王林オリジナル
2023-08-21 21:16:451658ブラウズ

C 構文エラー: 基本クラスのコンストラクター呼び出しが正しくありません。どのように対処すればよいですか?

C プログラミングでは、基本クラスのコンストラクターが呼び出される状況によく遭遇します。ただし、このプロセス中に、基本クラスのコンストラクターが誤って呼び出されることがあります。この状況では、多くの場合、プログラムが異常終了するか、不明なエラーが発生します。この状況に遭遇した場合でも、パニックにならないでください。この記事では、間違った基本クラス コンストラクター呼び出しとその対処方法について詳しく説明します。

1. 基本クラスのコンストラクターの誤った呼び出し

C では、基本クラスのすべてのメンバーが正しく初期化されていることを確認するために、派生クラスのコンストラクターはその基本クラスのコンストラクターを呼び出す必要があります。一般に、派生クラス コンストラクターのメンバー初期化リストで基本クラス コンストラクターを呼び出すのが最も一般的な方法です。ただし、基底クラス コンストラクターの呼び出しを間違えると、基底クラス コンストラクターが誤って呼び出される状況が発生します。基本クラス コンストラクターの呼び出しが正しくない一般的な状況をいくつか以下に示します。

  1. 基本クラス コンストラクターのパラメーターの型が一致しません。基本クラス コンストラクターを呼び出すときは、派生クラスがコンストラクター内のパラメーターの型は、基本クラス コンストラクターのパラメーターの型と一致します。基底クラスと派生クラスのコンストラクターのパラメータが一致しない場合、コンパイルエラーが発生します。例:
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){}
        Base(int a){ cout<<"Base class with value : "<<a<<"
";}
};
 
class Derived: public Base{
    public:
        Derived(){}
        Derived(int a){ cout<<"Derived class with value : "<<a<<"
";}
};
 
int main(){
    Derived d(10); // 编译错误:没有与此调用匹配的函数
    return 0;
}
  1. 基底クラスのコンストラクターが複数回呼び出されます。派生クラスのコンストラクターで基底クラスのコンストラクターを呼び出すときは、それが 1 回だけ呼び出されることを確認する必要があります。基本クラスのメンバーが複数回初期化されると、エラーが発生する可能性があります。例:
#include<iostream>
using namespace std;

class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};

class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};

int main(){
    Derived d;
    return 0;
}

出力結果は次のとおりです:

Base class constructor called
Derived class constructor called

上記のコードでは、派生クラスのコンストラクターが基本クラスのコンストラクターを呼び出します。そのため、「基本クラスのコンストラクターが呼び出されました」ただし、派生クラスはコンストラクタが1つしかないため、デフォルトではパラメータなしのコンストラクタが呼び出されるため、「派生クラスのコンストラクタが呼び出されました」も出力されます。基本クラスのコンストラクターを 2 回呼び出すと、エラーが発生します:

#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};
 
int main(){
    Derived d(10);
    return 0;
}

出力結果は次のとおりです:

Base class constructor called
Derived class constructor with value : 10 called
Base class constructor called

Base クラスは派生クラス コンストラクターのコンストラクターで 2 回呼び出されるため、したがって、「呼び出された基本クラスのコンストラクター」が 2 回出力されます。これは、C では、派生クラス オブジェクトの構築プロセスが最初に基本クラスのコンストラクターを呼び出し、次に派生クラスのコンストラクターを呼び出すためです。したがって、派生クラス コンストラクター内で基本クラス コンストラクターを 2 回呼び出すと、基本クラス コンストラクターが 2 回呼び出され、エラーが発生します。

  1. 基底クラス コンストラクターは呼び出されません。基底クラス コンストラクターで仮想関数を呼び出すとき、派生クラス コンストラクターで基底クラス コンストラクターを呼び出すとき、基底クラスの仮想関数は呼び出されず、プログラムでエラーが発生する可能性があります。
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ f(); }
        virtual void f(){ cout<<"Base
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived
"; }
        void f(){ cout<<"Derived
"; }
};
 
int main(){
    Derived d;
    return 0;
}

出力結果は次のとおりです:

Derived

上記のプログラムでは、基本クラス コンストラクターの f() 関数は仮想関数であり、Derived オブジェクトが作成されると、派生クラス コンストラクターは最初に基本クラスのコンストラクターを呼び出すため、基本クラスの f() 関数が呼び出されます。ただし、基底クラスのコンストラクターで f() が呼び出されたとき、派生クラス オブジェクトのコンストラクターはまだ実行されていないため、派生クラスの f() 関数はまだ呼び出されず、派生クラスの f() 関数のみが呼び出されます。基本クラスが呼び出されています。したがって、出力は「派生」ではなく「ベース」になります。

2. 基本クラスのコンストラクターの不正な呼び出しに対処するにはどうすればよいですか?

基本クラスのコンストラクターが誤って呼び出される状況に遭遇した場合、どのように対処すればよいでしょうか?以下に、間違った基本クラス コンストラクターの呼び出しを処理するいくつかの方法を示します。

  1. パラメーターの型を確認する: 基本クラスのコンストラクターを呼び出すときにパラメーターの型の不一致エラーが発生した場合は、そのデータ型が正しいかどうかを確認する必要があります。 int、double、char などのパラメータが正しいこと。
  2. コンストラクターの呼び出しを確認する: 基本クラスのコンストラクターが複数回呼び出される状況が発生した場合は、基本クラスのコンストラクターが派生クラスのコンストラクターで正しく呼び出されているかどうかを確認し、呼び出されるのが 1 回だけであることを確認する必要があります。 . .
  3. 基本クラス コンストラクターで仮想関数の呼び出しを避ける: 基本クラス コンストラクターで仮想関数を呼び出し、派生クラス コンストラクターで基本クラス コンストラクターを呼び出す場合は、基本クラス コンストラクターで仮想関数の呼び出しを避ける必要があります。関数内で。基本クラスのコンストラクターで仮想関数を呼び出す必要がある場合は、エラーを回避するために純粋仮想関数またはその他のメソッドを使用する必要があります。
  4. コンストラクターでスマート ポインターの使用を避ける: コンストラクターでスマート ポインターを使用する場合は、スマート ポインターで現在のオブジェクトへのポインターを使用しないようにする必要があります。現在のオブジェクトが初期化される前にスマート ポインターの値が NULL になり、実行時エラーが発生する可能性があるためです。

つまり、基本クラスのコンストラクターへの不正な呼び出しが発生した場合でも、パニックに陥ることなく、エラーを注意深く確認し、上記の処理方法に従って対処する必要があります。このようにして、基本クラスのコンストラクターへの誤った呼び出しによって引き起こされるプログラム実行エラーを効果的に回避できます。

以上がC++ 構文エラー: 基本クラスのコンストラクター呼び出しが正しくありません。どのように対処すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。