将值传递给虚拟方法
Pass by value to virtual methods
我有一个关于传递值对象构造和虚拟方法的问题。
我有一个这样的虚拟方法:
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
的方法。在派生类中提供的是该方法的实现。因此,将只调用一个方法。作为一个虚拟方法,它的实现通常会在运行时选择,但只会调用一个。
只会创建一个副本。。。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 使用模板而不是虚拟方法的管道模式
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 为什么调用没有正文的纯虚拟方法不会导致链接器错误?
- 出于什么目的,非虚拟方法将与C++一起使用?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 如何重写继承的嵌套类中存在的虚拟方法
- 私有虚拟方法有什么用?
- 基类可以声明虚拟方法但不定义它吗?仍然在派生类中定义
- googletest:测试基类具有纯虚拟方法的派生类时的核心转储
- 确保模拟的 GTest 方法覆盖虚拟方法
- CPP 继承虚拟方法解析顺序
- 我是否应该在包含虚拟方法的类上使用'memcpy'?如果没有,如何替换它?
- 用c++中的纯虚拟方法抽象模板类
- 解决虚拟方法的歧义继承的两种方法
- 没有针对完全专用模板类的外联虚拟方法定义