多态性并检查对象是否具有某种成员方法

Not*_*ble 0 c++ polymorphism pointers

我正在和朋友一起开发一个GUI库,我们遇到了如何确定某个元素是否可以点击(或者可移动等)的问题.

我们决定只检查特定对象是否存在函数,所有gui元素都存储在带有指向基类的指针的向量中.

所以,例如,如果我有

class Base {};
class Derived : public Base
{
    void example() {}
}
vector<Base*> objects;
Run Code Online (Sandbox Code Playgroud)

如何检查对象成员是否具有名为example的函数.

如果这不可能实现可选行为(如点击和相似)的不同方式.

Mik*_*one 8

您可以IsClickable()在基类中使用虚拟方法:

class Widget {
public:
    virtual bool IsClickable(void) { return false; }
};
class ClickableWidget : public Widget
{
public:
    virtual bool IsClickable(void) { return true; }
}
class SometimesClickableWidget : public Widget
{
public:
    virtual bool IsClickable(void); 
    // More complex logic punted to .cc file.
}
vector<Base*> objects;
Run Code Online (Sandbox Code Playgroud)

这样,对象默认不可点击.可点击的对象覆盖IsClickable()ClickableWidget替代而不是Widget.不需要花哨的元编程.

编辑:确定某些内容是否可点击:

if(object->IsClickable()) {
   // Hey, it's clickable!
}
Run Code Online (Sandbox Code Playgroud)