ホーム 院内・スタッフ紹介 診療時間・アクセス フォトギャラリー
0574-27-6355

院長のメモ帖

2016年6月18日 土曜日

C#プログラマへのC/C++の罠 その2継承修飾子?

最近はだいぶC++にも慣れ、変なエラーが出ることも少なくなりましたが、今日は久しぶりにやらかしました。
class Parent
{
 virtual void Method1();
}
class Child : Parent
{
 void Medhod1();
}
いわゆる、継承クラスを作ったわけですが、C++でもC#でもこの構文はだいたい同じですね。
C#では、常に修飾子overrideが子クラスのメソッドに必要ですが、C++の場合は抽象メソッドの実装時にだけ必要なのが違いますね。
まあ、そこも3分ぐらい手が止まりましたが、上記のC++コードにはもっと恐るべき罠が隠されていました。

C++プログラマーの方は、もう何が罠かお分かりかと思いますが、C#プログラマーにはその存在すら知られていない、継承修飾子というものが欠けているのです!
上記のChild定義ではこの継承修飾子を省略していますので、コンパイラはそれを補って
class Child : private Parent
{
 void Medhod1();
}
と解釈します。

するとどういうことが起こるかというと、親クラスの全メンバーのアクセス修飾子をprivateとして継承してしまいます。
となると、このChildクラスは親クラスからpublicメソッドを継承しても、外部からは呼び出せないprivateメソッドに変換してしまうので、外から見ると実質何も継承していないように見え、継承を前提としたコードはすべてエラー化してしまいます。

ですから、上記のコードは
class Child : public Parent
{
void Medhod1();
}
とpublic継承修飾子を書かなければならなかったのです。

いやー、継承修飾子にたどり着くまで、C++の継承解説ホームページを4つぐらい参照しましたよ。
このページにたどり着いて疑問が解消しました。継承修飾子について詳しく知りたい方は参照してください。
使わない機能なので解説してないんでしょうが、あるからには解説しておかないと、言語解説ページとしては失格ですね(<=他人に罪をなすりつけるな)。

以前、C++プログラマーの友人と話をしていて、彼はC->C++->C#の順に習得したので、C++からC#には非常にすんなり入れたといってました。
僕は、C->C#->C++の順なんですが、どうもこの道順には、いっぱいブービートラップが潜んでいるようです。





投稿者 美濃加茂市のIT獣医師 近藤 博 | コメント(2)

コメントする

名前:

メールアドレス:

コメント:

コメント

Ultimately, a dilemma that I'm passionate about. I have looked for data of this caliber for the previous various hours. Your internet site is greatly appreciated. kdbkaacegdfdeedf

Posted by Smithd448 2016年9月28日 水曜日

Spot lets start off perform on this writeup, I seriously consider this astounding internet site needs much more consideration. Ill apt to become once again to find out to read considerably a lot more, thank you that information. kbccffdebbkeggag

Posted by Smithd87 2018年3月25日 日曜日

カレンダー

2023年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31