我对按值传递对象构造和虚拟方法有疑问。
我有一个像这样的虚拟方法:
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对象是否会被创建两次,一次是传递给虚方法,另一次是传递给派生类的方法吗?
由于
答案 0 :(得分:3)
只会创建一个副本。 声明函数virtual时,通过动态绑定调用该派生类的方法。不是第一种方法A被调用然后调用方法B的情况。 COmpiler在运行时决定调用哪种方法。
答案 1 :(得分:2)
您的代码错误(缺少返回类型),但不是,只涉及一个副本。我认为你对多态性有错误的想法。它不像首先调用基类方法,然后转发到派生类。 TaskPool::AddTask
通过动态调度直接调用(如果它被称为多态)。
答案 2 :(得分:0)
这里只有一种方法:在基类中声明为virtual
的方法。您在派生类中提供的是该方法的实现。因此,只会调用一种方法。作为一个虚方法,它的实现通常会在运行时选择,但只会调用一个。
答案 3 :(得分:0)
只会创建一个副本......