c ++选择函数的继承优先级

时间:2016-06-29 13:35:13

标签: c++ inheritance virtual

我似乎无法理解编译器优先级如何去哪个函数。 这是一个示例代码:

#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())以及为什么?

3 个答案:

答案 0 :(得分:1)

pa->f()将始终致电A::f(),无论您pa指向什么,因为paA*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被标记为虚拟方法,因此运行时解析已完成,它将始终调用实例(BC)的方法。

答案 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()