2

繰り返しの質問かもしれないと思っていますが、関連するほとんどすべての投稿を読んでみましたが、探しているものに固有のものはありませんでした.

OK、それで、仮想とマークされていない限り、基本クラスのポインターから派生クラスの関数を呼び出すことができないことを理解しています。参照プログラム 1 のように、WhichClass() が virtual とマークされていない場合、B クラスのWhichClass() を呼び出すことはできません。

#include<iostream>
using namespace std;
class A
{
  public:
  const char* WhichClass(){return "A";}
};
class B:public A
{
  public:
  const char* WhichClass(){return "B";}
};

int main()
{
  B b;
  A &a = b;
  cout<<"In class "<<a.WhichClass();
  return 0;
}

仮想としてマークすると、基本クラスから最も派生したクラスの関数が呼び出されます。ここで、B から継承する別のクラス C を追加し (プログラム 2 に示すように)、クラス B でWhichClass() が仮想としてマークされていない場合、クラス C でベース参照 (&a) を呼び出す方法を考えます。 ? また、クラス B 参照 (&b) を使用して、プログラム 1 で観察したように、クラス B で仮想としてマークされていない場合でも、どのように C でWhichClass() を呼び出すことができますか?

#include<iostream>
using namespace std;
class A
{
  public:
  virtual const char* WhichClass(){return "A";}
};
class B:public A 
{
  public:
  const char* WhichClass(){return "B";}
};
class C:public B
{
  public:
  const char* WhichClass() { return "C";}
};
int main()
{
  C c;
  A &a = c;
  B &b = c;

  cout<<"In class " << a.WhichClass() << endl;
  cout<<"In class " << b.WhichClass() << endl;
  return 0;
}   
4

2 に答える 2

2

メソッドを基本クラスで仮想化し、派生クラスを指す基本クラスポインターを作成すると、その場合、最も派生したクラス関数が呼び出されるためです。あなたの場合、あなたが持っている、

A &a = c;

ここでは、基本クラス A のポインターがクラス C を指しているため、WhichClass() メソッドを呼び出すと、クラス C のメソッドが呼び出されます。

B &b = c;

ここでも、基本クラスのポインターを使用して関数を呼び出すと、指しているクラスに基づいてほとんどの派生クラスの関数が呼び出されます。この場合、クラスBのポインタはクラスCのオブジェクトを指しているので、クラスCのWhichClass()メソッドが呼び出されます。詳しくは、ポリモーフィズムをご確認ください

于 2013-03-21T04:57:38.137 に答える
2
  1. virtualクラスチェーンでは、同じ定義を持つすべての以下のレベルの派生クラス関数として、基本クラスでいくつかの関数を宣言すると、自動的にvirtual.
  2. この関数選択の背後にあるシーンは、オーバーライドに応じて、概念呼び出しによって行われますvirtual table。ということで、気になる方はこちらをお読みください
  3. C++ 11 では、finalキーワードを使用して、あるレベルでのオーバーライドを停止できます。(例:クラス「C」がクラス「B」の機能をオーバーライドするのを避けたい場合WhichClass)。ここをチェック
于 2013-03-21T05:25:02.177 に答える