跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • C++ 小白不懂就问, polymorphism 父类调用子类的 function, 限制不允许修改任何 class 的内容…
未分類
19 10 月 2020

C++ 小白不懂就问, polymorphism 父类调用子类的 function, 限制不允许修改任何 class 的内容…

C++ 小白不懂就问, polymorphism 父类调用子类的 function, 限制不允许修改任何 class 的内容…

資深大佬 : AkideLiu 7

题目如下:

The code in the main() function is incomplete. Write code as described in each of the comments marked (1), (2) and (3) above. Your code for (2) and (3) should take advantage of polymorphism to keep the code simple and short.

我的解法如下:(虽然解出来了,感觉有点蠢,之前并没有用到过 static_cast )

重点是我觉得我的解法跟 polymorphism 多态好像没啥关系,是我的思路有问题吗?

#include <string> #include <iostream>  using namespace std;  // class definition for Quadraped class Quadruped{ protected:     int height; // height of the quadruped in hands public:     Quadruped(int height); // constructor     int get_height();  // get the height };  Quadruped::Quadruped(int hands){   // implementation of constructor     height=hands; }  int Quadruped::get_height(){  // implementation of get_height     return height; }  // ------------------------------------------------------------   // abstract class for Equines class Equine:public Quadruped{ public:     Equine(int hands); // constructor     virtual void ride() =0;  // not implemented here };  // constructor Equine::Equine(int hands):Quadruped(hands){     return; // nothing more to do }  // ------------------------------------------------------------   class Horse:public Equine{ public:     Horse(int hands); // constructor     virtual void ride();  // will define };  Horse::Horse(int hands):Equine(hands){     return; // nothing more to do }  void Horse::ride(){     cout << "You ride off into the sunset" << endl; }   // ------------------------------------------------------------  class Zebra:public Equine{ private:     int stripes; public:     Zebra(int hands); // constructor     virtual void ride();  // will define     void setStripes(int strs);     int getStripes(); };  Zebra::Zebra(int hands):Equine(hands){     stripes=0;     return; }   void Zebra::ride(){     cout << "The Zebra bites you and does not let go." << endl; }  void Zebra::setStripes(int strs) {     stripes=strs; }  int Zebra::getStripes() {     return(stripes); }  // ------------------------------------------------------------  int main(){     //collection of assets     int num=4;     Quadruped* my_things[num];      // complete the code below      // (1) add two horses and two zebras to my_things, all of different heights.      for (int i = 0; i < num; i++) {         if (i < 2) {             my_things[i] = new Horse(100 + i * 10);         } else {             my_things[i] = new Zebra(100 + i * 10);         }     }      // (2) call ride on each of the items in my_things      Equine * temp[num] ;      for (int i = 0; i < num; ++i) {          temp[i] = static_cast<Equine *>(my_things[i]);          temp[i]->ride();      }        // (3) add code to set the number of stripes on any zebras to 13.     for (int i = 0; i < num; ++i) {          if (typeid(*temp[i]).name() == typeid(Zebra).name()) {              Zebra * temp_zebra = static_cast<Zebra*>(my_things[i]);              temp_zebra->setStripes(13);              cout << temp_zebra->getStripes() << endl;                      }     }       // clean up      for (int i = 0; i < num ; ++i) {         delete temp[i];     }   } 

以上代码输出结果如下( memcheck 没有内存泄漏):

C++ 小白不懂就问, polymorphism 父类调用子类的 function, 限制不允许修改任何 class 的内容...

大佬有話說 (12)

  • 資深大佬 : across

    换 dynamic_cast,typeid 不用了。

  • 主 資深大佬 : AkideLiu

    @across dynamic_cast 会报错

  • 資深大佬 : nightwitch

    static_cast<>可以用于向下转换,但是没有运行期检查,转换的正确性需要由程序员自行保证。dynamic_cast 只能运用在有虚函数的类中,因为只有在虚标里会记录 RTTI 的一些信息。

    由于你之前在(2)已经把基类转到了带有虚函数的 Equine*, 所以你的(3)可以使用 dynamic_cast 向下转换,而无需使用 typeid
    https://paste.ubuntu.com/p/VvKt87PSZd/

    此外,这道题有点小问题,Equine 应该加上虚析构函数,不然子类里的资源会出现内存泄漏,不过你这里的子类都没有申请动态内存。

  • 資深大佬 : user8341

    auto zebra = dynamic_cast<Zebra*>(temp[i]);

  • 資深大佬 : nightwitch

    @nightwitch Fix 第一句:RTTI -> offset_to_top,用于 dynamic_cast

  • 資深大佬 : 786375312123

    能不能按照 StackOverflow 上的格式,用一个 minimum 的例子写出来,写了一大堆东西不知道你想问什么

  • 資深大佬 : xuanbg

    主你的代码这么粗暴真的好么?你把 Equine 定义成抽象类,然后 Horse,Zebra 作为 Equine 的实现,不就啥事都没了?

  • 資深大佬 : xuanbg

    @xuanbg 啊啊,代码看漏了,不好意思。我的问题是为什么不指定 my_things 的类型为 Equine ?

  • 主 資深大佬 : AkideLiu

    @786375312123
    这是个 4 个 class 合成在一起,水平有限真的不知道如何缩短了

    @xuanbg 哈哈哈硬性要求不允许修改 class 内容

    @user8341
    @nightwitch
    谢谢两位提到的 dynamic_cast, 我看看如何修正一下。请问出了 dynamic_cast 还有更优解吗

  • 主 資深大佬 : AkideLiu

    @nightwitch 请问使用 cast downgrade class 类型和多态还有联系吗?

  • 資深大佬 : 52coder

    求教下,这是在哪刷的题?leetcode?

  • 主 資深大佬 : AkideLiu

    @52coder 不是公开平台

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具