c++ - 如何从基指针推断类的子类型

标签 c++ inheritance

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

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

我有其他选择吗?

最佳答案

可能有多种选择。

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

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

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) {
  ...
}

关于c++ - 如何从基指针推断类的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32655908/

相关文章:

C++默认参数

c++ - wxWidgets 在 windows 上生成 .a lib 文件

python - Pascal 类型化二进制文件的 C++ 和 Python 类似物

javascript - JS 继承 : calling the parent's function from within the child's function

c++ - 如何在接口(interface)类中创建父类(super class)对象?

c++ - 替代 GNU make 3.79.1 的 makefile 中的二次扩展

c++ - 从 QTcpSocket 读取数据的问题

java - Java中重写接口(interface)而不是父类

Python多重继承不显示类变量或第二个继承基类的方法

python - 如何在Python 3中重用父类(super class)方法的变量?