C++ DLLの中身と親子クラスの関係について
- C++ DLLの中身とは、親クラスと子クラスの関係について説明します。
- 親クラスを継承した子クラスを含むDLLが作成されると、子クラスのDLLには親クラスの処理内容も含まれます。
- 親クラスにバグがある場合、子クラスも再コンパイルする必要があります。
- ベストアンサー
【C++】DLLの中身
親クラス:ParentClassが、 メンバ m_a メソッド GetA SetA それを継承した子クラス:ChildClass が、 メンバ m_a ←オーバーライド m_b ←子クラスで追加 メソッド GetA ←オーバーライド SetA ←オーバーライド GetB ←子クラスで追加 SetB ←子クラスで追加 という構成で、それぞれ別のDLLを作成したとき、 以下のどちらになるでしょうか? 「(1)」の認識であり、必ず、子クラスは、親クラスのファイルサイズよりも大きくなるという認識です。 (1)「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包している。 (※ChildClass.DLLのコンパイル時に、親クラスの処理も、記載されたような状態でDLLが作成される) (2) 「ChildClass.DLL」では、 コンパイル時の「ParentClass」の処理内容を内包せず、 実行時に、親クラスのDLLに委譲している。 また、「(1)」であるならば、 親クラスにバグがあって修正した場合、 必ず子クラスも再コンパイルしなければならない認識ですが合っていますでしょうか? /**************************************/ また、DLLがクラスX、クラスYで構成されているとき、 クラスXのobj と、 クラスYのobj と、 クラスXのlib (クラスYから、クラスXの処理を呼び出せるようにするために、クラスX側からpublic で実行できる関数のIN・OUTの仕様が記載されている) クラスYのlib が、含まれているという認識で良いのでしょうか? . コンパイル時、libや、objができますが、これらはDLLに内包される
- TeferiMage
- お礼率99% (215/217)
- C・C++・C#
- 回答数3
- ありがとう数4
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
C++/CLI は無視する. そして, いまさらだがこの質問は自分で試せば答が出るはずじゃないか? 親クラスを ParentClass.h/ParentClass.cpp で, それを継承した子クラスを ChildClass.h/ChildClass.cpp に書いたとする. このとき ParentClass.cpp から ParentClass.obj, ChildClass.cpp から ChildClass.obj ができることになるが, 「子クラスの DLL」を作るときに ・ChildClass.obj だけから作る ・ParentClass.obj と ChildClass.ob の両方から作る ことの両方が可能で, このどちらを使うかによって「親クラスの処理を内包する」こともできるし「子クラスの処理だけを持つ」こともできる. どちらにもメリット/デメリットがあるのはわかるよね?
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
C++ の規格に「DLL」なんてものはないから処理系による. より自明なこととして「どのように DLL を作るか」を知らずして答えることは不可能. ついでに 「 また、DLLがクラスX、クラスYで構成されているとき、 クラスXのobj と、 クラスYのobj と、 クラスXのlib (クラスYから、クラスXの処理を呼び出せるようにするために、クラスX側からpublic で実行できる関数のIN・OUTの仕様が記載されている) クラスYのlib が、含まれているという認識で良いのでしょうか?」 は何を言っているのか全くわからん. 少なくとも「何に」含まれているのかが書かれていない.
お礼
ありがとうございます。 (質問の主語述語が曖昧で申し訳ありません。) DLLは言語の規格として決まっているわけではないのですね。 「どのように DLL を作るか」にもよる。ということなのですね。 ということは、 子クラスのDLLに親クラスの処理を含むこともありうるし、 子クラスのDLLと、親クラスのDLLを分けることもありうる。 ということになるのでしょうか? /*************************************/ 「何に」の部分ですが「子クラスに」で質問したかった感じです。 子クラスのDLLは、内部的には、 「自分のクラスと親のクラスのobjとlibが内蔵されている」という認識で合っているのでしょうか? .
- Tacosan
- ベストアンサー率23% (3656/15482)
確認ですが, ChildClass の m_a や GetA, SetA は「オーバーライド」した, つまり ParentClass から継承したのではなく, 改めて ChildClass で定義した ということですか?
お礼
すみません、例が良くなかったです。 例は2つ必要でした。 (申し訳ありません…) (1)メソッドをオーバーライドしなかった場合 (「子で再定義していないため、親のdllを参照しに行くような動きになるのか」 それとも 「子クラスに同処理を機械語で内包されているので子クラス内で完結するのか?」を知りたいです。 (2)メソッドをオーバーライドした場合 子クラスとしてのメソッドGet_aの振る舞いをさせたいケースがほとんどでしょうし、 それだけ考えたら、 親のメソッドを子のdllに機械語で内包させる理由はないのかなとも思ったのですが、 明示的に「parent_class::Get_a」と書いたとき、 想定A:親クラスのdllを処理を依頼する のか、 想定B:子クラス内に同名メソッドが親の分と子の分が同梱され、子のDLL内で完結するのか? を知りたいです。
関連するQ&A
- C++のdllの作り方を教えてください。
こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。
- ベストアンサー
- C・C++・C#
- 【C++】静的リンクと動的リンクの違い
静的リンクと動的リンクの違いについて教えてください。 ググって、wikiにて確認したところ、 動的リンクは、実行時にプログラムの結合を行う。 静的リンクは、コンパイル直後の実行ファイル生成時に、ライブラリ等を全てリンクし、必要なコードが全て揃った実行ファイルを生成する。 というのはわかりました。 それを踏まえて、 (1)-(1)libファイルで静的リンクさせるケース メソッドやプロパティのインデックスというかインタフェース仕様のみ書かれている。 そして、そのインデックスを元にコンパイルチェックを行っている。 (1)-(2)objファイルで静的リンクさせるケース objには、.cppと、.h に書かれている処理のうち、そのソース本体(そのクラス自身のモノとして持っている処理)のプロパティやメソッドのことが機械語で書かれている。 プロパティやメソッドが書かれているため、当然インタフェース仕様もわかる。 であろうと捉えていますが、この認識で大雑把には合っていますでしょうか? また、DLLを使う場合、動的リンクとは呼ばれているものの、 「DLLでは、objに加え、必要なリンクの情報まで持っている」と思われるので、 結局、リンカによるリンク実行時に、インタフェースで不整合が起きていないかはチェックされているという認識なのですが、合っていますでしょうか? (だとすると、なぜ、ある意味、DLLを使っていても静的リンクなのかなと感じ、動的リンクと呼ぶことに不自然さを感じます) 宜しくお願いいたします。 .
- ベストアンサー
- C・C++・C#
- 親クラスのポインタ、クラスを指定しないポインタ
親クラス A (抽象メソッドX、Yの2つを持つ) と 子クラス B-1 (親はA、抽象メソッドX、Y、Zの3つを持つ) 子クラス B-2 (親はA、抽象メソッドX、Y、Wの3つを持つ) のように、子クラスでポリモーフィズムを実現しているとき、 クラスC 「実行時に、iniファイルに(1)と書かれていたら、B-1のクラスで実体化し、 iniファイルに(2)と書かれていたら、B-2のクラスで実体化する」 というクラスを作りたいです。 //////////////////////////////////////////////////////////////// 質問(1) その際、クラスCは、どうやってもZのメソッドや、Wのメソッドは書けない認識です。 (メソッド名もiniファイルから取るようにすれば別でしょうが。) この認識であっていますでしょうか? 質問(2) 逆に、XとYについては、それぞれ挙動の違う処理を行わせることができる認識です。 (クラスCで、親クラスAのポインタ型の変数を用意しておき、 そのポインタに、DLLのインスタンス化したものをいれておけば、 メソッドXとYについては実行可能という認識です)
- ベストアンサー
- C・C++・C#
- .objファイル、.lib ファイルについて
◆C++でのコンパイルされたプログラムの参照について。 以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、 それを他のプログラムからリンクして使用していました。 C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について Visual Studioにて、.obj、.lib を、参照先に設定していますが、 内容をよくわかっていません。 オブジェクトリンク、ライブラリリンクとは、 (1)それぞれどんな概念なのでしょうか? (2).obj、.libでは何が違うのでしょうか?
- ベストアンサー
- C・C++・C#
- 【C++】相互参照
以下のような相互参照は、 感覚的には、なるべくならしない方が良いと感じるのですが、 どのようなメリット・デメリットがあるでしょうか? class A B* m_b class B A* m_a ■少なくとも、多くのクラスによって構成された巨大なDLLが、 相互参照ばかりで作られると、 (1)クラスAのポインタ型のメンバーが、クラスB内で値が変わりうる、 また、クラスBを、クラスCで参照していたら、そこでも値が変わりうる。 さらにクラスCを、クラスDで参照していたら、(略)となり、 処理・メンバー値の変更の影響の把握が困難になる。 (2)lib/objの作成順のミスや管理、 (3)いずれかのクラスのリコンパイルが発生した時、 リリース物のリコンパイルが発生しまくる。 ということがあり、良くないと考えています。 - - - - - - - - - - - - - - - 相互にインタフェースし合う項目を、メンバーとして宣言しつつ、 そのGetter、Setterを用意すれば、強結合にせずに作れるという認識ですが合っていますか? class A B* m_b int x1、y1、z1 x1、y1、z1のGetter、Setter class B Privateなメンバーx、y、z int x2、y2、z2 x2、y2、z2のGetter、Setter .
- ベストアンサー
- C・C++・C#
- Visual studio c++ dll作成時のエラー
c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 【C++】0保証の有無
Cの開発経験のみで、C++に関しては初心者です。 下記のサンプルコードで、main()関数にてobj1.xとobj2.y の初期値設定をしているのですが、 obj1.yとobj2.xに関しては何も設定していません。 obj2.xはobj1.xの値をコピーしているので問題ないと思いますが、 obj1.yは不定な値をインクリメントする事には ならない(0保証される)のでしょうか? (出力結果を見ると、0が入っていたと認識できるんですが、 結果論で片付けるのはイヤなので・・・) 以下、サンプルコード ---------------------------------- #include<iostream> using namespace std; class POINT { public: long x; long y; void operator ++(int n) { x++; y++; } POINT operator ++() { ++x; ++y; return *this; } } obj1 , obj2 ; int main() { obj1.x = 10; obj2.y = 5; obj2 = ++obj1; obj2++; cout << "x = " << obj1.x << "\ty = " << obj1.y << '\n'; cout << "x = " << obj2.x << "\ty = " << obj2.y << '\n'; return 0; } ----------------------------
- ベストアンサー
- C・C++・C#
- C#の継承関係。
すこし、疑問におもい質問いたします。 以下のようなコードなのですが using System; using System.Windows.Forms; public class MainClass{ public static void Main (){ Test01 obj01 , obj02; Test02 obj03 , obj04; obj01= new Test01(); obj01.method01(); obj03 = new Test02(); obj03.method02(); try{ obj02 = (Test01)obj03;(1) //obj02.methodp();(2) obj04 = (Test02)obj01;(3) }catch(Exception e){ MessageBox.Show(e.Message); } } } public class Test01{ public void method01(){ MessageBox.Show("スーパークラスメソッド"); } private void methodp (){ MessageBox.Show("スーパークラスプライベートメソッド"); } } public class Test02 : Test01{ public void method02(){ MessageBox.Show("サブクラスメソッド"); } } まず(1)の箇所ですが、これはTest02というTest01のクラスを継承したサブクラスを Test01という親クラスにキャストしてます。 これは、問題なく動いているようです。 ただ、その下の(2)の箇所でキャストしたインスタンスから親クラスのプライベートメソッドにアクセスしようとしたらコンパイル時にエラーとなりました。 サブクラスを親クラスにしても親クラスのプライベートメソッドって使えないのでしょうか?であれば親クラスへのキャストって何のためにあるのでしょうか? 次に(3)の箇所ですが、これはTest01という親クラスをTest02という子クラスにキャストしようとしていますが、どうも、親クラスから子クラスへキャストできないといいう例外が 発生するようです。 これはなぜなのでしょうか? 以上の点でご教授いただけませんでしょうか? よろしくお願いします。
- ベストアンサー
- Microsoft ASP
- CのDLLをVC++でコンパイルしたいのですが、エラーになってしまいます。
c言語の初心者なのですが、質問させて下さい。 javaからCのDLLを呼び出したく、 (下記のソースを書いたのですが、VC++でコンパイルすると LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/HelloWorld.exe : fatal error LNK1120: 外部参照 1 が未解決です。 と出てしまいます。 過去ログ等を見て、作成しているプロジェクトが悪いのかなと思い、 MFC appWizark(dll) win32 Application win32 Console Application win32 Dynamic-Link Library 等を作ってみてコンパイルしてみたのですが、駄目でした。 ちなみにDOSプロンプトで cl -IC:\j2sdk1.4.2_10\include\win32 -LD HelloWorl d.c -o HelloWorld.dll と実行するときちんとコンパイルできて、正常に実行も出来ました。 VC++でどうやればコンパイルできるのでしょうか? #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_printMessage (JNIEnv *env, jobject me) { printf("Helo World!!!\n"); return; }
- ベストアンサー
- C・C++・C#
- C#でWin32 MFC DLLが呼び出せない
C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。
- 締切済み
- C・C++・C#
お礼
ありがとうございます! 「子クラスの DLL」を作るときに (1)ChildClass.obj だけから作る (2)ParentClass.obj と ChildClass.obj の両方から作る の2つの方法ができたのですね! .