質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

533閲覧

子クラスのメソッド呼出しについて

torimingo

総合スコア122

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/13 00:54

編集2019/01/13 00:57

Displayクラスを継承して、MainWindowクラスとSettingWindowクラスをつくりました。
main()のなかで、MainWindowクラスとSettingWindowクラスのオブジェクトを生成して、メソッドを呼んだところ、Displayクラスのメソッドが呼ばれてしまいました。
MainWindowクラスとSettingWindowクラスのメソッドは、どのようにしたら呼べるでしょうか・・・?
以下にコードを掲載します。

C++

1 1 #include<iostream> 2 2 3 3 using namespace std; 4 4 5 5 namespace SCKELTON{ 6 6 class Display{ 7 7 public: 8 8 virtual void disp(){ 9 9 cout << "Display" << endl; 10 10 } 11 11 }; 12 12 }; 13 13 14 14 namespace LOGIC{ 15 15 class MainWindow : public SCKELTON::Display{ 16 16 void disp(){ 17 17 cout << "MainWindow : Display" << endl; 18 18 } 19 19 }; 20 20 class SettingWindow : public SCKELTON::Display{ 21 21 void disp(){ 22 22 cout << "SettingWindow : Display" << endl; 23 23 } 24 24 }; 25 25 }; 2626 27 27 namespace FACTORY{ 28 28 class Factory{ 29 29 public: 30 30 SCKELTON::Display* getDisplay(int i){ 31 31 if(i == 1){ 32 32 display = new LOGIC::MainWindow; 33 33 }else{ 34 34 display = new LOGIC::SettingWindow; 35 35 } 36 36 return display; 37 37 } 38 38 static Factory* getFactory(){ 39 39 if(!factory){ 40 40 factory = new Factory(); 41 41 } 42 42 return factory; 43 43 } 44 44 static Factory *factory; 45 45 private: 46 46 SCKELTON::Display *display; 47 47 }; 48 48 Factory *(Factory::factory) = new Factory(); 49 49 }; 50 50 51 51 int main() { 52 52 SCKELTON::Display *disp; 53 53 disp = FACTORY::Factory::getFactory()->getDisplay(1); 54 54 disp->disp(); 55 55 disp = FACTORY::Factory::getFactory()->getDisplay(2); 56 56 disp->disp(); 57 57 return 0; 58 58 }

デバッガで実行してみたところ、17行目と、22行目は、通っているようなのですが、なぜか9行目のcout文が実行されてしまいます・・・。
Factoryクラスのオブジェクトをシングルトン?にしてみたのですが、それが悪かったんでしょうか・・・。
ご存知のかたがおりましたら、教えて頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MainWindowSettingWindowの側で、void disp()publicにする必要があると思われます。

投稿2019/01/13 01:14

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torimingo

2019/01/13 01:16

ご回答ありがとうございます。 解決いたしました。 ありがとうございました!
episteme

2019/01/13 12:06

仮想関数のbindingがpublic/privateに縛られたっけ?
torimingo

2019/01/13 23:19

16行目と21行目の「void disp()」をpublicにしないで、「virtual void disp()」に書き換えるという方法でも、17行目と22行目のcout文が実行されました。 この方法ですと、public/privateに縛られていないですね。 (子クラスのvirtualは、意図的に付加しなくても、親クラスのvirtualを受け継いで、自動的に付加されるものだと思っていましたが、違うのですね・・・)
episteme

2019/01/14 00:17

シグニチャがマッチすれば勝手にvirtual扱いになるはず。 僕の環境(Visual C++ 2017)ではそうなった。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問