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

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

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

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

Q&A

解決済

2回答

1141閲覧

派生クラスの関数の呼び方について

oppeke

総合スコア11

C++

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

0グッド

0クリップ

投稿2020/05/23 05:28

編集2020/05/23 05:30

いつもお世話になっております。

c++のクラスについてご質問させてください。

C++

1#include <iostream> 2 3class Animal 4{ 5public: 6 Animal() {}; 7 virtual void Voice() {}; 8}; 9 10class Dog : public Animal 11{ 12public: 13 Dog() {}; 14 15 void Voice() override 16 { 17 std::cout << "wanwan" << std::endl; 18 } 19}; 20 21 22int main() 23{ 24 // OK 25 Animal* animal = new Dog(); 26 animal->Voice(); 27 28 // NG 29 Dog dog; 30 Animal animal2 = dog; 31 animal2.Voice(); // wanwanとは表示されない 32 33 std::getchar(); 34 35 return 0; 36}

上記のソースコードのように、Animalクラスを基底クラスとした、Dogクラスがあるとします。
Animalクラスでは、Voice関数を仮想関数とし、派生先で定義するようにします。
Dogクラスでは、Voice関数内で"wanwan"と出力するようにしています。

Anima型の変数を定義し、Voice関数を呼んだ時に、派生先のクラスを呼ぶ方法として、
上記のソースコードのmain関数内の//OKの部分のやり方があると思います。
こちらのサイトを参考にしました
実際、//OKの方だと"wanwan"と出力されます。

ここでお聞きしたいのですが、Animalをポインタとしない方法で、派生先の関数を呼ぶ方法は無いのでしょうか?
// NGの部分のような方法で行いますと、animal2では派生先のVoice関数は部分は呼ばれませんでした。
原因としては、newしないとDogのインスタンス?が作成されない為、AnimalのVoice()が呼ばれてしまうと考えています。(正直あまり理解できていません)

やりたいことの目的としては、
Animal変数とDog変数を作成したあとに、型名を指定せずに(new Dog()とはせずに)、派生先の関数を呼びたいのですが、
こんな事は仕様上できないかもしれませんが、もしあればお聞きしたく思います。

開発環境は、VisualStudio2017です。

宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

cpp

1Animal& animal2 = dog;

とすれば可能です。
ポリモーフィズムについて学習すると理解できると思います。
参考:http://capm-network.com/?tag=C%EF%BC%8B%EF%BC%8B%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0

原因としては、newしないとDogのインスタンス?が作成されない為、AnimalのVoice()が呼ばれてしまうと考えています。

newしてるかどうかは本質ではないです。
例えば以下の例でもちゃんと動きます。

cpp

1 Dog dog; 2 Animal *animal = &dog; 3 animal->Voice();

投稿2020/05/23 05:39

編集2020/05/23 05:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

oppeke

2020/05/23 06:08

ご回答ありがとうございました! 参考サイトのURLご提示ありがとうございます >>例えば以下の例でもちゃんと動きます。 そんな書き方もできるのですね。。。難しいです。。。 理解できるよう、学習を続けたいと思います。
guest

0

Animalをポインタとしない方法で、派生先の関数を呼ぶ方法は無いのでしょうか?

参照で呼べば大丈夫です。

C++

1 Dog dog; 2 Animal& animal2 = dog; 3 animal2.Voice();

投稿2020/05/23 05:34

maisumakun

総合スコア146018

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

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

oppeke

2020/05/23 06:08

ご回答ありがとうございます! ご提示の方法で実現することができました。 有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問