将值传递给虚拟方法

时间:2012-09-03 11:42:55

标签: c++ inheritance

我对按值传递对象构造和虚拟方法有疑问。

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

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 个答案:

答案 0 :(得分:3)

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

Polymorphism and Dynamic Binding

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

只会创建一个副本......

相关问题