你能帮我解释一下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-virtual
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
,然后 class B
没有自己的函数 fun
所以这是意料之中的。来到下一个输出,事实证明即使引用 class B
调用 Do
,它变成对派生 class C
的调用为什么那?
当方法变为虚拟时,调用不再取决于调用它的对象的数据类型,而是决定对该方法的调用的地址。由于方法 Do
是虚拟的。现在调用地址,地址基本上属于'C',所以调用了C
的Do
,希望你明白了。
这个程序的输出是:
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-virtual
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
,然后 class B
没有自己的函数 fun
所以这是意料之中的。来到下一个输出,事实证明即使引用 class B
调用 Do
,它变成对派生 class C
的调用为什么那?
当方法变为虚拟时,调用不再取决于调用它的对象的数据类型,而是决定对该方法的调用的地址。由于方法 Do
是虚拟的。现在调用地址,地址基本上属于'C',所以调用了C
的Do
,希望你明白了。