【问题标题】:Determine type of child class with baseclass pointer用基类指针确定子类的类型
【发布时间】:2014-03-26 19:57:54
【问题描述】:

有没有办法用基类指针确定子类的类型?

我已经在这样的类构造函数中声明了一个指针 在 .h 文件中

baseclass *screen;

在构造函数中

screen = new childclass();

假设基类有 5 个不同的子类,在我的程序中,我将指针切换为指向各种子对象,如何确定屏幕当前指向的对象的类型?

【问题讨论】:

  • 在 C++ 中,变量有类型,而值没有,所以任何实现你想要的方式都是肮脏的,而你想要实现它的事实揭示了一些类层次结构设计问题。
  • 你为什么要这样做,而不是依靠多态性来完成“与底层类型相应的行为”?
  • 也许这是一个糟糕的设计,但它适用于具有不同屏幕的小游戏,每个屏幕都是基本屏幕类的子类,在我的“游戏”类中,我有一个名为 activescreen 的屏幕对象,我指出根据我要绘制的游戏的不同部分,分配给不同的子对象。
  • “也许是糟糕的设计……” - 不,它糟糕的设计。当基类必须明确知道派生自它的类时,设计中就有缺陷。

标签: c++


【解决方案1】:

不要。

使用虚拟调度为不同的派生类型实现不同的行为。

【讨论】:

    【解决方案2】:

    您可以比较 typeid 的: typeid(somepointer) == typeid(someclass) 以找出实际实例化的对象。

    【讨论】:

      【解决方案3】:

      您可以这样做。但正如许多其他人所建议的那样,这不是正确的方法。派生类应该处理不同的行为。

      #include <iostream>
      #include <typeinfo>
      using namespace std;
      
      class Base{
      public:
          virtual void func();
      };
      
      class Derived : public Base{
      public:
          virtual void func(){
              return;
          }
      };
      
      class AnotherDerived : public Base{
      public:
          virtual void func(){
              return;
          }
      };
      
      int main(){
          Base *dp = new Derived;
          Base *adp = new AnotherDerived;
          cout << typeid(*dp).name() << endl;
          cout << typeid(*adp).name() << endl;
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2017-11-27
        • 2011-04-21
        • 2021-07-02
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        相关资源
        最近更新 更多