C++ C++;带虚拟继承的重载方法绑定
好的,我有一个关于以下代码(1112223)输出的问题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/,
#包括
结构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 parameterstruct C
,它是一种。第二个函数有as parameterstruct 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 parameterstruct C
,它是一种。第二个函数有as parameterstruct sc
,它也是一种。重载解析规则说第二个函数比前者更可行。