我似乎无法理解编译器优先级如何去哪个函数。 这是一个示例代码:
#include <iostream>
using namespace std;
class A{
public:
int f() {return 1;}
virtual int g() {return 2;}
};
class B: public A {
public:
int f() {return 3;}
virtual int g() {return 4;}
};
class C: public A{
public:
virtual int g() {return 5;}
};
int main () {
A *pa;
B b;
C c;
pa = &b;
cout<< pa -> f()<<endl<<pa -> g() << endl;
pa = &c;
cout<< pa -> f() << endl; cout<< pa -> g() << endl;
return 0;
}
每次调用哪个函数(g()和f())以及为什么?
答案 0 :(得分:1)
pa->f()
将始终致电A::f()
,无论您pa
指向什么,因为pa
是A*
且A::f
不是虚拟强>
pa->g()
会调用A::g()
,B::g()
或C::g()
,具体取决于pa
指向使用polymorphism的内容,因为A::g
是的虚拟强>:
pa
指向B
(第一个序列),则会调用B::g()
。pa
指向C
(第二个序列),则会调用C::g()
。答案 1 :(得分:0)
在第一个序列中,它会调用A::f()
和B::g()
。
在第二个序列中,它会调用A::f()
和C::g()
。
原因是在编译期间根据变量类型(指向f()
的指针)解析A
非虚方法。 g()
中的A
被标记为虚拟方法,因此运行时解析已完成,它将始终调用实例(B
或C
)的方法。
答案 2 :(得分:0)
当你说一个函数是Sub AddNewAllocToSpendLine(sectionHeading As String, Optional sSheetName As String = c_Alloc2SpendSheetName)
Worksheets(sSheetName).Activate
'get the section heading position
Set c = Worksheets(sSheetName).Range("A:A").Find(sectionHeading, LookIn:=xlValues, LookAt:=xlWhole)
Debug.Print c
Dim addrow As String
Dim lRow As Long
addrow = c.Row + 1
If addrow <> "" And IsNumeric(addrow) = True Then
Rows(addrow).Insert shift:=xlDown
Else
MsgBox ("enter only row number")
End If
End Sub
时,你告诉编译器使用后期绑定而不是静态绑定。
因此在编译期间virtual
将是静态绑定的,因此它可以修复哪个方法体调用。
另一方面,A::f()
在编译期间不会绑定到任何方法体。它将在运行时决定调用哪个方法体(使用vptr)。
A::g()