如何从基指针推导出类的子类型

时间:2015-09-18 15:35:26

标签: c++ inheritance

我有一个基类(Notification)和两个子类(WebNotification和DesktopNotification)。我从外部源接收WebNotifications和DesktopNotifications,而不是将它们作为Notification指针传递给GUI实体,该GUI实体应根据通知类型执行不同的操作。 如何根据通知*?

推断出子类型

我知道在Notification类中添加类型的枚举会起作用,但它似乎不是一个优雅的解决方案。

我有其他选择吗?

2 个答案:

答案 0 :(得分:2)

可能有多种选择。

首先,专业行为应该是类的一部分,而不是客户端的一部分。这意味着你应该避免动态检查类的类型,除非你真的被迫。

这通常是通过多态实现的:

class Notification {
public:
  virtual void render(UI* ui) = 0;
};

class WebNotification : public Notification {
public:
  void render(UI* ui) override {
    ....
  }
};

在某些情况下,这还不够,所以您可以选择标记您的课程,例如

class Notification {
public:
  enum class Type {
    WEB,
    DESKTOP
  };

private:
  Type type;

protected:
  Notification(Type type) : type(type) { }

public:
  Type getType() const { return type; }
};

class WebNotification : public Notification {
public:
  WebNotification() : Notification(Notification::Type::WEB) { }
};

...
Notification* notification = ...
if (notification->getType() == Notification::Type::WEB)
  ...

或者让编译器为你标记它们,但你必须启用RTTI,有时候这是不可取的:

if (dynamic_cast<WebNotification*>(notification) != null) {
  ...
}

答案 1 :(得分:0)

使用动态强制转换,即

Notification* notification;

WebNotification* web_notification = dynamic_cast<WebNotification*>(notification);

    if ( web_notification != NULL ) {
    // this is a web notification;
}

DesktopNotification* dt_notification = dynamic_cast<DesktopNotification*>(notification);
if ( dt_notification != NULL ) {
    // this is a desktop notificaiton
}