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