ホームページ > バックエンド開発 > C++ > C の派生クラスから基本クラスの仮想関数を呼び出すにはどうすればよいですか?

C の派生クラスから基本クラスの仮想関数を呼び出すにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-13 02:28:09
オリジナル
847 人が閲覧しました

How Can I Call a Base Class's Virtual Function from a Derived Class in C  ?

C でのオーバーライドにもかかわらず基本クラスの仮想関数を呼び出す

オブジェクト指向プログラミングでは、派生クラスが仮想関数をオーバーライドするのが一般的です。それらの基本クラス。ただし、派生クラスがオーバーライドされた関数にアクセスする必要がある状況が発生する可能性があります。

次の C コードを考えてみましょう:

class Foo {
public:
    int x;

    virtual void printStuff() {
        std::cout << x << std::endl;
    }
};

class Bar : public Foo {
public:
    int y;

    void printStuff() {
        // I would like to call Foo.printStuff() here...
        std::cout << y << std::endl;
    }
};
ログイン後にコピー

上記の例では、Bar クラスが printStuff 関数をオーバーライドします。ただし、基本クラスのバージョンへのアクセスも必要になる場合があります。

Java のスーパー vs. C構文

Java では、super.funcname() 構文を使用して、派生クラスが基本クラスのメソッドを呼び出すことができます。ただし、C では別のアプローチが必要です。オーバーライドされた基本クラス関数を呼び出すには、次の構文を使用します。

class Bar : public Foo {
  // ...

  void printStuff() override {  // help the compiler to check
    Foo::printStuff(); // calls base class' function
  }
};
ログイン後にコピー

この構文では:

  • オーバーライドはオプションですが、コンパイラーが適切なオーバーライドを確実に行うために推奨されます。
  • Foo::printStuff() は基本クラスのメソッドを明示的に呼び出します。 function.

Java とは異なり、C では多重継承が許可されるため、この明示的な名前付けが必要です。その結果、コンパイラはオーバーライド時にどの基本クラス メソッドを呼び出すかを認識する必要があります。

使用例

元のコードに戻ると、次の変更により Bar が可能になります。 :printStuff() は、独自のデータ メンバー y と基本クラスのデータ メンバー x の両方にアクセスします:

void printStuff() override {
    Foo::printStuff();
    std::cout << y << std::endl;
}
ログイン後にコピー

この改良版printStuff の関数は、基本クラスの x 値を出力し、その後に派生クラスの y 値を出力し、必要な機能を提供します。

以上がC の派生クラスから基本クラスの仮想関数を呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート