テキストの記述はmain関数でいくつかの派生クラスのオブジェクトを作成し、そのポインタを基本クラスのポインタ型配列に代入して、メンバ関数を呼び出すというものです。
ポインタ型配列の初期値として、派生クラスのアドレスを設定するように変更してみると、
ShowData()関数を呼び出した時点でメンバ変数nameが空になっているようで、名前の所だけ何も表示されなくなりました。
なぜこのようなことになったのか教えていただけませんか。
class Jugyoin{
public:
int number; // 社員番号
string shimei; // 氏名
long kyuyo; // 給与
virtual void ShowData(); // メンバ変数の値を表示する
Jugyoin(); // 引数のないコンストラクタ
Jugyoin(int n, string s, long k);// 引数を持つコンストラクタ
};
// Yakuinクラスの定義
class Yakuin : public Jugyoin{
public:
int kabu; // 株式保有数
void ShowData();
Yakuin();
Yakuin(int n, string s, long k, int kb);
};
// Kachoクラスの定義
class Kacho : public Jugyoin{
public:
int shuchohi; // 出張費
void ShowData();
Kacho();
Kacho(int n, string s, long k, int sh);
};
// Jugyoinクラスのメンバ関数の実装定義
void Jugyoin::ShowData()
{
cout << "社員番号:" << number << "\n";
cout << "氏名:" << shimei << "\n";
cout << "給与:" << kyuyo << "\n";
}
Jugyoin::Jugyoin()
{
number = 0;
shimei = "未設定";
kyuyo = 150000;
}
Jugyoin::Jugyoin(int n, string s, long k)
{
number = n;
shimei = s;
kyuyo = k;
}
// Yakuinクラスのメンバ関数の実装定義
void Yakuin::ShowData()
{
Jugyoin::ShowData();
cout << "株式保有数:" << kabu << "\n";
}
Yakuin::Yakuin()
{
kabu = 100;
}
Yakuin::Yakuin(int n, string s, long k, int kb):Jugyoin(n, s, k)
{
kabu = kb;
}
// Kachoクラスのメンバ関数の実装定義
void Kacho::ShowData()
{
Jugyoin::ShowData();
cout << "出張費:" << shuchohi << "\n";
}
Kacho::Kacho()
{
shuchohi = 10000;
}
Kacho::Kacho(int n, string s, long k, int sh):Jugyoin(n, s, k)
{
shuchohi = sh;
}
int main()
{
// 基本クラスのポインタの配列を作成する
Jugyoin* p[6] = { &Yakuin(1111,"役員一郎",500000,1000),
&Kacho(2222,"課長一郎", 350000,10000),
&Kacho(3333,"課長次郎", 300000,5000),
&Eigyoman(4444,"営業一郎",230000,1235),
&Eigyoman(5555,"営業次郎",250000,4567),
&Eigyoman(6666,"営業三郎",270000,6789)
};
//Jugyoin* p[6];
// 派生クラスのオブジェクトを作成し、基本クラスのポインタに代入する
//Yakuin y(1111,"役員一郎",500000,1000);
//p[0] = &y;
//Kacho b1(2222,"課長一郎", 350000,10000);
//p[1] = &b1;
//Kacho b2(3333,"課長次郎", 300000,5000);
//p[2] = &b2;
//Eigyoman e1(4444,"営業一郎",230000,1235);
//p[3] = &e1;
//Eigyoman e2(5555,"営業次郎",250000,4567);
//p[4] = &e2;
//Eigyoman e3(6666,"営業三郎",270000,6789);
//p[5] = &e3;
// メンバ関数を呼び出す
for( int i = 0 ; i < 6 ; i++ ){
p[i]->ShowData();
}
}