派生类与多次调度中的过载方法
Overloading method in derived class vs multiple dispatch
根据wikipedia,多重调度是
...可以根据运行时间(动态)类型的多个参数进行动态调度函数或方法。
但是,在C 中,我可以在派生类中覆盖一个函数:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void method(int a) { cout << a; }
virtual void method(int a, int b) { cout << a + b; }
};
class Derived: public Base
{
void method(int a) { cout << a * 10 << endl; }
void method(int a, int b) { cout << (a + b) * 10 <<endl; }
};
int main()
{
Base* derived = new Derived;
derived->method(1);
derived->method(1, 2);
return 0;
}
此处的method
在运行时绑定(因为我使用的是virtual
),并且根据输入参数选择了特定方法 - 这与Wikipedia的Wikipedia描述有何不同?
次要问题:如果在C ?
no。根据接收器的静态类型和参数,编译器静态地选择候选人。然后,在运行时,仅使用接收器的动态类型将调用绑定到最特定的覆盖方法。参数的动态类型在动态绑定阶段不起作用。
在您的特殊情况下,这意味着对于调用derived->method(1);
,编译器查看接收器的静态类型(Base
)和实际参数(int
)。然后,在Base
(Base
中继承或声明)的所有方法中,它搜索与最匹配的方法;这是Base::method(int)
。在运行时,运行时系统查看接收器的动态类型(Derived
),以覆盖Base::method(int)
(即Derived::method(int)
)的最特定方法,并使用给定的实际参数(1
)调用该方法。
同样为第二个通话。
它在运行时仅根据一个参数即可在运行时间绑定。虚拟函数根据其调用对象的(动态)类型提供单一调度。
基于编译时间的其他参数的数字和(静态)类型的过载的选择。
不是多次调度,因为仅基于一个参数完成运行时选择:对象"派生"的类型。函数超载分辨率在编译时处理。
virtual void Base::method(int a);
可以看作是
/*virtual*/ void method(Base&, int a);
因此,在您的情况下,您有
derived->method(1);
将在以下方面派遣:
/*virtual*/ void method(Base&, int a);
/*virtual*/ void method(Derived&, int a);
和derived->method(1, 2);
将在:
/*virtual*/ void method(Base&, int a, int b);
/*virtual*/ void method(Derived&, int a, int b);
,在两种情况下,仅根据一个参数进行派遣。
void method2(Base&, Base&);
void method2(Derived&, Base&);
void method2(Base&, Derived&);
void method2(Derived&, Derived&);
如果您想要(使用Base* derived = new Derived
) method2(*derived, *derived);
调用void method2(Derived&, Derived&);
然后需要多次调度。
(目前,它称为void method2(Base&, Base&);
)。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何在c++中实现处理器调度模拟器
- 有什么方法可以遍历结构吗
- 没有虚拟调度的默认方法实现
- 空隙和非空隙方法之间的Sfinae调度
- 派生类与多次调度中的过载方法
- C 双重调度,出厂模式或一种从接收到的序列数据创建派生对象的方法
- 静态调度以使用聚合类型的层次结构更正成员方法
- 对于虚拟机,哪种调度方法更有效
- Java 和 C++ 中的动态方法调度
- 动态调度在类外部声明的方法
- 线程调度程序模拟:唤醒和睡眠Pthread的正确方法
- C++类方法,可以使用虚拟调度或类似于没有对象上下文的静态函数来调用
- 动态调度方法