将值传递给虚拟方法

Pass by value to virtual methods

本文关键字:虚拟 方法 值传      更新时间:2023-10-16

我有一个关于传递值对象构造和虚拟方法的问题。

我有一个这样的虚拟方法:

typedef boost::function1<void, void*> Task
class ITaskPool
{
    //......
    virtual AddTask(Task task) = 0;
};

然后是像这样的实现

class TaskPool : public ITaskPool
{
    //......
    AddTask(Task task);
};

如果我这样使用它;

void MyFunc(void* arg)
{
}
int main()
{
    TaskPool tp;
    tp.AddTask(&MyFunc); 
}

Task对象会被创建两次吗?一次是在它被传递给虚拟方法时创建的,另一次是当它被传递到派生类的方法时创建?

感谢

只会创建一个副本。当您声明一个函数virtual时,该派生类的方法将通过动态绑定调用。不是先调用方法A,然后调用方法B的情况。COmpiler在运行时决定调用哪个方法。

多态性与动态结合

您的代码是错误的(缺少返回类型),但不是,只涉及一个副本。我认为你对多态性的看法是错误的。这不像基类方法先被调用,然后被转发到派生类。TaskPool::AddTask是通过动态调度直接调用的(如果它是多态调用的)。

这里只有一个方法:在基类中声明为virtual的方法。在派生类中提供的是该方法的实现。因此,将只调用一个方法。作为一个虚拟方法,它的实现通常会在运行时选择,但只会调用一个。

只会创建一个副本。。。