你能帮我解释一下C++计划的结果吗?

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

本文关键字:计划 C++ 一下 结果 解释      更新时间:2023-10-16

这个程序的输出是:

A::

乐趣 C::D o

为什么不是:

A::

乐趣 A::d o

主要是关于虚拟功能的工作原理,但我对它不是那么熟悉,实际上我完全是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
  • 继承的非虚拟Fun

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,然后类 B 没有自己的函数称为 fun所以这是意料之中的。来到下一个输出,事实证明,即使引用类B调用Do,它也变成了对派生类的调用C这是为什么呢?

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