设计我的方式进入dynamic_cast我该怎么办?

时间:2014-03-08 11:42:33

标签: c++ polymorphism dynamic-cast

我正在阅读Simple Event Handling。作者为他的事件使用了一个简单的结构,但建议:

  

这里可能的改进是传递指向事件的指针   类而不是结构。然后,Event类可以包含任何类   可以为其创建信息量和派生类   不同类型的活动。我选择一个更简单的选项,主要是因为   我们项目的范围并不需要这么复杂的解决方案。

我将其实现为:

class Event
{
public:
typedef unsigned long   EventType;

explicit    Event(EventType type);
EventType   getType() const;

private:
EventType   mType;
};

class EventStr : public Event
{
public:
typedef unsigned long   EventType;

EventStr(EventType type, std::string str);
std::string getString() const;

private:
std::string mString;
};

void EventDispatcher::sendEvent(const Event& event);

main()
{
   Event e = EventStr(0x496bf752, "derived data");
   SendEvent(e);
}

我的想法是派生类型可以有自己唯一的数据(在这个例子中是一个字符串)。但是,我发现在处理事件时需要使用dynamic_cast来访问EventStr :: getString。在另一方面,我没有使用虚函数,因为我希望基类是准系统,并在派生类中具有特定的细节。

我的理解是dynamic_casts是典型的糟糕设计。那是我的红旗。是否有可能有一个准系统基类,然后向派生类添加其他详细信息,同时仍然能够传递派生类型作为对基类的引用?如果不是作者的建议?

1 个答案:

答案 0 :(得分:1)

如果您有不同的事件类型,则具有基本事件类和变体事件的派生类是如何使用面向对象的。使用函数成员为事件对其环境作出反应的不同方式定义纯虚拟。这个想法正是如此,所以你可以传递对象,就像它们是基类一样。

你应该看一个好的C ++教程(是的,有许多“面向对象的编程”教程/文本,但是OOP语言非常不同,所以并非所有的都有帮助)。我见过的是cppreference的那个,也许是wikibook。我敢打赌Stroustrup目前的The C++ Programming Language是非常彻底和清晰的(从我早先的一个版权判断来看)。