【发布时间】:2018-01-31 01:49:46
【问题描述】:
我有一个接口,用户从中派生多个我不知道的类,但我仍然想将这些派生类称为公共方法Run().
Event 类旨在成为一个接口,因此我知道如何调用我的 unknown UserEvents 派生类,因为它们都必须实现 Run() 方法。
我目前有一些代码并收到CallEvent can't allocate an abstract Event 的错误。我理解错误,但不知道如何正确执行。
这是一些最小的代码示例 (WandBox):
#include <iostream>
class Event
{
public:
virtual void Run(int Param) = 0;
};
// This is a user event and I have no idea what the class name is,
// but I still have to call it's method Run() that is common to the interface "Event"
class UserEvent : public Event
{
public:
virtual void Run(int Param) { std::cout << "Derived Event Dispatched " << Param << std::endl;};
};
// This parameter is of pure abstract base class Event because
// I have no idea what my user class is called.
void CallEvent(Event WhatEvent)
{
WhatEvent.Run(123);
};
int main()
{
std::cout << "Hello World!" << std::endl;
UserEvent mE;
CallEvent(mE);
}
【问题讨论】:
-
mE 按值传递给接受事件的 CallEvent。这称为切片。更改 CallEvent 以获取指针或引用。
-
将
void CallEvent(Event WhatEvent)更改为void CallEvent(Event& WhatEvent)。 (这是理查德克里顿所说的。) -
谢谢,成功了!如果我收到
UserEvent* mE = nullptr并做了诸如WhatEvent = new Event();之类的事情,是否可以达到相同的效果? Like so -
你不能
new Event()因为class Event是抽象的(纯virtualRun()方法)。如果class Event不是抽象的,CallEvent()会有什么意义?它得到一个指针WhatEvent,它用Event的新实例覆盖它。此外:如果WhatEvent是指针,则选择运算符.在WhatEvent.Run(123)中是错误的。相反,您必须使用WhatEvent->Run(123);。所以,CallEvent()应该是:void CallEvent(Event *WhatEvent) { if (WhatEvent) WhatEvent->Run(123); }。if (WhatEvent)确保Event::Run()的调用只针对非nullptrs 完成...... -
...否则非法。
标签: c++ abstract-class virtual