C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で派生クラスメソッドにさらに制限されたアクセスが与えられるとどうなりますか


このセクションでは、C++での派生クラスメソッドへのアクセスを制限する興味深い事実について説明します。いくつかの例を見て、出力を分析して、C++で派生クラスメソッドを使用する際の制限について詳しく説明します。

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
}

これで問題ありません。メインの機能ブロックをこれに置き換えると、次のようなエラーが発生します-

int main() {
   DerivedClass d;
   d.display();
}

出力

main.cpp: In function ‘int main()’:
main.cpp:20:15: error: ‘virtual void DerivedClass::display()’ is private
within this context
d.display();
^
main.cpp:13:10: note: declared private here
void display() {
^~~~~~~

派生クラスのメソッドはプライベートであるため、エラーが表示されます。次に、この実装を見てみましょう。ここでは、関数がベースポインタを使用して呼び出されます。これにより、関数を呼び出すことができます。

例(C ++)

#include <iostream>
using namespace std;
class BaseClass {
public:
   virtual void display(){
      cout << "Print function from the base class" << endl;
   }
};
class DerivedClass: public BaseClass {
private:
   void display() {
      cout << "Print function from the derived class" << endl;
   }
};
int main() {
   BaseClass *b = new DerivedClass;
   b->display();
}

出力

Print function from the derived class

上記のプログラムから、プライベート関数DerivedClass ::display()が基本クラスのポインターを介して呼び出されていることがわかります。display()関数は基本クラスでパブリックであるため、プログラムは正常に機能します。アクセス指定子はコンパイル時に検証され、display()は基本クラスでパブリックになります。実行時には、ポイントされたオブジェクトに対応する関数のみが呼び出され、アクセス指定子は検証されません。したがって、派生クラスのプライベート関数は、基本クラスのポインターを介して呼び出されています。


  1. C ++のドット演算子とは何ですか?

    ドットと矢印の演算子は、どちらもC++でクラスのメンバーにアクセスするために使用されます。それらはさまざまなシナリオで使用されます。 C ++では、クラス、構造体、または共用体として宣言された型は「クラス型」と見なされます。したがって、以下はそれらの両方を指します。 a.bは、bがオブジェクトのメンバー(またはオブジェクトへの参照[1])である場合にのみ使用されます。したがって、a.bの場合、aは常にクラスの実際のオブジェクト(またはオブジェクトへの参照)になります。 a→bは基本的に(* a).bの省略表記です。つまり、aがオブジェクトへのポインタである場合、→bはポイントするオブジェ

  2. C ++のアクセス修飾子とは何ですか?

    データの非表示は、オブジェクト指向プログラミングの重要な機能の1つであり、プログラムの機能がクラス型の内部表現に直接アクセスするのを防ぐことができます。クラスメンバーへのアクセス制限は、ラベル付けされたアクセス修飾子(クラス本体内のパブリック、プライベート、および保護されたセクション)によって指定されます。 メンバーとクラスのデフォルトのアクセスはプライベートです class Base {    public:       // public members go here       protected: &n