自定义虚拟功能

时间:2014-07-02 21:36:27

标签: c++ polymorphism

我必须使用C ++设计一个库,以下是我的要求。

  1. 用户应该能够扩展我的API类方法
  2. 用户实现的虚拟方法将以多态方式在库内部调用
  3. 我必须在每次虚拟方法调用之前和之后放置两个日志条目
  4. 当用户创建他/她自己的类和虚拟方法时,如果他/她使用我的库(有链接),除了正常的动态绑定之外,还应满足上面第3点(有两个日志条目)< / LI>

    这个想法可以像这样概述出来吗?

    class BaseClass
    {
    public:
        virtual void foo() = 0;
    };
    

    用户实现就像

    class DerivedClass: public BaseClass
    {
    public:
        virtual void foo() {/*come impl*/}
    };
    

    使用以下代码

    BaseClass * bp = new DerivedClass();
    bp->foo();
    

    应该等同于

    BaseClass * bp = new DerivedClass();
    log_start(typeid(*bp).name());
    bp->foo();
    log_end(typeid(*bp).name());
    

    但我不能问我的图书馆用户(甚至我无处可去),只要他们使用我的API,就可以把这些记录内容放进去。由于有很多虚函数及其用法,我无法在我的lib中随处可见。

    有没有简单的方法来实现这一目标?我是否需要创建自己的虚拟桌?

2 个答案:

答案 0 :(得分:3)

您可以让用户实施foo,而不是让他们直接致电foo,而是拨打barbar会将呼叫包裹到foo,如:

class BaseClass { 
public:
    void bar() {
        log_start(typeid(*this).name());
        foo();
        log_end(typeid(*this).name());
    }

protected:
    virtual void foo() = 0;
};

用法是:

BaseClass * bp = new DerivedClass();
bp->bar();

答案 1 :(得分:2)

在这种情况下,您应该使用类似 Template Method 模式的内容

class BaseClass
{
public:
    void foo() {
         log_start(typeid(*this).name()); 
         doFoo(); 
         log_end(typeid(*this).name()); 
    }
protected:
    virtual void doFoo() = 0;
};

class DerivedClass: public BaseClass
{
protected: // or private, depends on use case
    virtual void doFoo() {/* some impl */}
};

int main() {
    BaseClass * bp = new DerivedClass();
    bp->foo();
    delete bp;
    return 0;
}

查看工作示例here