仮想関数について読んでいて、
VF は、継承されたクラスのポリモーフィズムで使用されます。
そのため、クラスと派生クラスの両方が同じ関数名を持つ場合、VF は適切な関数を関数呼び出しにバインドします。
つまり、問題の関数が基底クラスで virtual に指定されている場合、派生クラスの関数が呼び出されます。仮想でない場合は、基本クラスの関数が呼び出されます。
Java ではデフォルトで: すべての関数は仮想 C++: 非仮想であり、Java では final のプライベート アクセス修飾子を使用して仮想にすることができますが、C++ では Virtual キーワードを使用して関数を仮想にします。
上記の理論に基づいて、私はコードを書きました:
#include <iostream>
class base{
public :
virtual void function1(){
std::cout<<"BaseVirtual"<<std::endl;
}
void function2(){
std::cout<<"Base NonVirtual"<<std::endl;
}
};
class derieved: public base
{
public :
void function1(){
std::cout<<"Derieved Virtual"<<std::endl;
}
void function2(){
std::cout<<"Derieved NonVirtual"<<std::endl;
}
};
int main()
{
base b1;
derieved d1;
b1.function1();
b1.function2();
d1.function1();
d1.function2();
}
事実に基づいて、仮想関数の場合、派生クラス関数のみが呼び出される場合、上記のプログラムの出力は次のようになります。
BaseVirtual
Base NonVirtual
Derieved Virtual
Base NonVirtual
ただし、次のようになりました。
BaseVirtual
Base NonVirtual
Derieved Virtual
Derieved NonVirtual
もちろん、これは正しいに違いありません。したがって、私の質問は、出力がステートメントに完全に違反していることです。問題の関数が基本クラスで仮想に指定されている場合、派生クラスの関数が呼び出されます。仮想でない場合は、基本クラスの関数が呼び出されます。呼び出しの場合:
d1.function2();