你能帮我解释一下C++程序的结果吗?

Could u help me to explain the result of the C++ program?

这个程序的输出是:

A::Fun C::Do

为什么不是:

A::Fun A::do

主要讲的是虚函数的工作原理,但我不是很熟悉,其实我完全是C++的新手,真的需要你的耐心,谢谢。

#include <iostream>
using namespace std;

class A {
private:
    int nVal;
public:
    void Fun() { cout << "A::Fun" << endl; }
    void Do()  { cout << "A::Do" << endl;  }
};

class B :public A {
public:
    virtual void Do() { cout << "B::Do" << endl; }
};

class C :public B {
public:
    void Do()  { cout << "C::Do" << endl; }
    void Fun() { cout << "C::Fun" << endl; }
};

void Call(B &p) {
    p.Fun();
    p.Do();
}

int main() {
    C c;
    Call(c);
}

A 中的两个函数都不是虚函数。

所以在 B 中我们有:

  • 虚拟Do
  • 继承non-virtualFun.

p.Fun

很明显它调用了A::Fun


p.Do

它调用 C::Fun 因为:

  • DoB,
  • 中是虚拟的
  • C 覆盖 Do
  • p是引用类型

调用 p.Fun() 在编译时解析为 A::Fun()。由于它不是 virtual 函数,因此 A::Fun() 也会在 运行 时执行。

调用 p.Do() 在编译时解析为 B::Do()。由于它是一个 virtual 函数并且对应于真实对象的类型 C 具有重写的实现,因此 C::Do() 在 运行 时间执行。

输出结果是

A::Fun
C::Do

原因是 B 继承自 A,然后 class B 没有自己的函数 fun 所以这是意料之中的。来到下一个输出,事实证明即使引用 class B 调用 Do,它变成对派生 class C 的调用为什么那?

当方法变为虚拟时,调用不再取决于调用它的对象的数据类型,而是决定对该方法的调用的地址。由于方法 Do 是虚拟的。现在调用地址,地址基本上属于'C',所以调用了CDo,希望你明白了。