C++ C++;带虚拟继承的重载方法绑定

C++ C++;带虚拟继承的重载方法绑定,c++,overloading,virtual-inheritance,method-signature,C++,Overloading,Virtual Inheritance,Method Signature,好的,我有一个关于以下代码(1112223)输出的问题 #包括 结构C{ 虚拟整数eq(常数C和其他)常数{return 1;} }; 结构SC:C{ 虚拟整数eq(常数C和其他)常数{return 2;} 虚拟整数eq(常量SC&other)常量{return 3;} }; 无效go(常数C&C、常数C&c1、常数SC&SC){ 使用名称空间std; C++中的CUT不支持多个调度,只对调用函数的对象(动态调度只适用于此< /Co>指针)。 sc.eq(c1); 编译器将动态类型为 SC/,

好的,我有一个关于以下代码(1112223)输出的问题

#包括
结构C{
虚拟整数eq(常数C和其他)常数{return 1;}
};
结构SC:C{
虚拟整数eq(常数C和其他)常数{return 2;}
虚拟整数eq(常量SC&other)常量{return 3;}
};
无效go(常数C&C、常数C&c1、常数SC&SC){
使用名称空间std;

C++中的CUT

不支持多个调度,只对调用函数的对象(动态调度只适用于<代码>此< /Co>指针)。

sc.eq(c1);

<编译器>编译器将动态类型为<代码> SC/<代码>,但在C++中,将使用静态类型的<代码> C1 < /代码>

< P>不支持多个调度,只对调用函数的对象(动态调度只适用于<代码>此< /代码>指针)。
sc.eq(c1);

编译器将分派到动态类型的
sc
,但将使用静态类型的
c1

,这是由于函数解析规则

在本次通话中:

sc.eq(c1);
一旦c1类型为
struct C
,且
eq
动态重载,则只能调用一个函数

但是在电话里

sc.eq(sc);
您有两个可能要调用的
eq
函数。第一个函数在
struct C
中声明,动态重载
eq
,第二个函数在
struct SC
中声明。一旦
SC
类型为
struct SC
时,最后一个方法比前者更可行


这就是为什么会得到
3

这是由于函数解析规则

在本次通话中:

sc.eq(c1);
一旦c1类型为
struct C
,且
eq
动态重载,则只能调用一个函数

但是在电话里

sc.eq(sc);
您有两个可能要调用的
eq
函数。第一个函数在
struct C
中声明,动态重载
eq
,第二个函数在
struct SC
中声明。一旦
SC
类型为
struct SC
时,最后一个方法比前者更可行


这就是为什么你会得到
3

@ThomasBadan你如何解释c1.eq(sc);返回2?c1是
struct SC
的一个实例,而参数
SC
的类型是
struct SC
,因此它应该返回3,不是吗?@igorpov Only SC的类型是
struct SC
。c1的类型是
struct C
(查看go函数的定义,即使原始对象是SC),所以它只知道动态重载
eq
。也就是说,
virtualinteq(const C&other)const{return 2;}
@ThomasBadan+1,现在我对子类化和绑定有了更好的理解:)@ThomasBadan我最后一个问题:如何在
C.eq(sc)中
类型为
struct c
的对象
c
知道
sc
?类型为
struct c
@igorpov sc的参数也属于
struct c
类型。请查看其声明。它是
struct c
的后代(继承)因此,任何期望
struct C
的函数都可以用来传递声明为其后代的对象(在本例中为sc)
,有两个可调用的函数。第一个函数有as parameter
struct C
,它是一种。第二个函数有as parameter
struct sc
,它也是一种。重载解析规则说第二个函数比前者更可行。@ThomasBadan你如何解释c1.eq(sc);返回2?c1是
struct SC
的一个实例,而参数
SC
的类型是
struct SC
,因此它应该返回3,不是吗?@igorpov Only SC的类型是
struct SC
。c1的类型是
struct C
(查看go函数的定义,即使原始对象是SC),所以它只知道动态重载
eq
。也就是说,
virtualinteq(const C&other)const{return 2;}
@ThomasBadan+1,现在我对子类化和绑定有了更好的理解:)@ThomasBadan我最后一个问题:如何在
C.eq(sc)中
类型为
struct c
的对象
c
知道
sc
?类型为
struct c
@igorpov sc的参数也属于
struct c
类型。请查看其声明。它是
struct c
的后代(继承)因此,任何期望
struct C
的函数都可以用来传递声明为其后代的对象(在本例中为sc)
,有两个可调用的函数。第一个函数有as parameter
struct C
,它是一种。第二个函数有as parameter
struct sc
,它也是一种。重载解析规则说第二个函数比前者更可行。