你能帮我解释一下C++计划的结果吗?
Could u help me to explain the result of the C++ program?
这个程序的输出是:
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
因为:
-
Do
在B
是虚拟的, -
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',所以C
的Do
被调用,希望你明白了。
相关文章:
- 如何让C++'tally up'结果并制定计划?
- C++窗口的计划问题
- 回复计划游戏结果不会显示
- 我正在努力处理多维数组输入和输出,我管理输入,但是打印无法按计划工作
- 如何从文本文件输出数据?(学生成绩单计划)
- 为什么在此计划中,我在所有情况下都获得 0%?
- Windows 并发运行时任务计划,但有例外
- C++航班预订计划
- 如何计划在将来时间运行的操作
- 自动(toCast)显式转换是否计划在未来C++标准?
- 任务计划程序库的预处理不起作用 - 多定义错误
- GLES计划资源索引/位置与统一索引/位置
- 我应该如何使用C++创建 Google 行动行动计划履行端点?
- 多米诺骨牌计划。我不知道如何将我的矢量拉到空白中以打印出来
- C++计划持续时间内(字体)资源的分配
- 是否有任何计划将"expects"添加到 std::optional?
- 我可以在计算数据计划上修复该C 程序的任何建议吗?
- 任务计划程序:设置运行级别时拒绝访问
- 基本C++计划提前结束
- 驾驶执照考试计划.无法将 std:: 字符串转换为 std :: 字符串和其他错误