3

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

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

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对象会被创建两次,一次是传递给虚方法,另一次是传递给派生类的方法?

谢谢

4

4 回答 4

3

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

多态性和动态绑定

于 2012-09-03T11:44:59.327 回答
2

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

于 2012-09-03T11:44:08.040 回答
0

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

于 2012-09-03T11:46:04.840 回答
0

只会创建一个副本...

于 2012-09-03T11:47:21.757 回答