C++で継承してメンバ関数をhidingした話

C++の勉強がてら、簡単な独自クラスを作ってみた。

“class Clang {

protected:  string name;  double ver; public:  Clang();  void set(string n, double v);  void show();  ~Clang(); };

//Clangコンストラクタ Clang::Clang() {  cout << “Create Clang Object” << endl;  name = “”;  ver = 0; }

//set関数 void Clang::set(string s, double v) {  cout << “Set Clang Object” << endl;  name = s;  ver = v; }

//show関数 void Clang::show() {  cout << “Show Clang Object ” << endl;  cout << “Clang UserName :” << name << endl;  cout << “Clang Version  :” << ver << endl; }

//Clangデストラクタ Clang::~Clang() {  cout << “Delete Clang Object” << endl; }'

ユーザー名とバージョン情報を保持するClangクラスになります。 メンバ関数set()を使うことで、メンバ変数を変更で、show()でメンバ変数をコンソール画面に描画します。

これをCppクラスへと継承させてみます。

class Cpp : public Clang { public:  Cpp();  void show();  ~Cpp(); };

//コンストラクタ Cpp::Cpp() {  cout << “Create Cpp Object” << endl; }

//show関数(Clangのshow関数をhiding) void Cpp::show() {  cout << “Show Cpp Object” << endl;  cout << “Cpp UserName :” << name << endl;  cout << “Cpp Version  :” << ver << endl; }

//デストラクタ Cpp::~Cpp() {  cout << “Delete Cpp Object” << endl; }

ついでに、Clang::show()をhidingしてみました。

ちなみに、こちらが実行時のコンソール画面です。

​ ​

 

サンプルとして一応、下記にソースを上げておきますね。

//クラスサンプル

include

include <windows.h>

include

using namespace std;

class Clang {

protected:  string name;  double ver;

public:  Clang();  void set(string n, double v);  void show();  ~Clang(); };

//Clangコンストラクタ Clang::Clang() {  cout << “Create Clang Object” << endl;  name = “”;  ver = 0; }

//set関数 void Clang::set(string s, double v) {  cout << “Set Clang Object” << endl;  name = s;  ver = v; }

//show関数 void Clang::show() {  cout << “Show Clang Object ” << endl;  cout << “Clang UserName :” << name << endl;  cout << “Clang Version  :” << ver << endl; }

//Clangデストラクタ Clang::~Clang() {  cout << “Delete Clang Object” << endl; }

class Cpp : public Clang {

public:  Cpp();  void show();  ~Cpp(); };

//コンストラクタ Cpp::Cpp() {  cout << “Create Cpp Object” << endl; }

//Show関数(Clangのshow関数をオーバーライド) void Cpp::show() {  cout << “Show Cpp Object” << endl;  cout << “Cpp UserName :” << name << endl;  cout << “Cpp Version  :” << ver << endl; }

//デストラクタ Cpp::~Cpp() {  cout << “Delete Cpp Object” << endl; }

int main() {

 //Clangオブジェクト生成  Clang c;  string username1 = “S.H.”;  double ver1 = 1.00;

 //メンバ変数のセット  c.set(username1, ver1);

 //show関数でメンバ変数を描画  c.show();

   Sleep(3000);

 //Cppクラスオブジェクト生成  Cpp cpp;  string username2 = “Asaki”;  double ver2 = 2.00;

 //メンバ変数のセット(Clangクラスより継承)  cpp.set(username2, ver2);

 //オーバーライドしたshow関数でメンバ変数を描画  cpp.show(); 

 Sleep(3000);

 return 0; }

追記:ご親切な方よツッコミをいただきまして訂正しました。

誤:オーバーライド 正:hiding でした。