いつもお世話になっております。
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です。
宜しくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/23 06:08