このC++プログラムでは、
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
cout<<"\n\nBase ctr";
fun();
}
virtual void fun()
{
cout<<"\n\nBase's fun()";
}
};
class Derived : public Base
{
public:
Derived()
{
cout<<"\n\nDerived ctr";
fun();
}
virtual void fun()
{
cout<<"\n\nDerived's fun()";
}
};
int main()
{
Derived obj;
return 0;
}
Derivedクラスオブジェクトを使用してBaseクラスのコンストラクターから仮想関数を呼び出すと、Baseのクラスfun()が呼び出されます。
出力::
ベースセンター
ベースのfun()
派生ctr
派生のfun()
ここで説明されている理由 が
このJavaプログラムでは、
class Base
{
Base()
{
System.out.println( "\n\nBase ctr" );
fun();
}
void fun()
{
System.out.println( "\n\nBase's fun()" );
}
}
class Derived extends Base
{
int a=1;
Derived()
{
System.out.println( "\n\nDerived ctr a = "+a );
a=8;
fun();
}
void fun()
{
System.out.println( "\n\nDerived's fun() a = "+a );
}
public static void main(String args[])
{
Derived obj = new Derived();
}
}
出力は::
Basectr
派生したfun()a = 0
派生ctra= 1
派生したfun()a = 8
ここでは、派生クラスfun()が呼び出されているため、 c++プログラムに適用される制約はJAVAプログラムには適用されません。なぜ?