提问人:Jasmeet Singh 提问时间:9/9/2023 最后编辑:Mark RotteveelJasmeet Singh 更新时间:9/9/2023 访问量:53
在下面的程序中,我不明白答案 A::h() 和 A::h() [closed]
In the following program, I don't understand the answer A::h() and A::h() [closed]
问:
在我看来,pA 是 A 型的指针,但持有 B 型b_object的地址。由于 h() 是类 B 中的虚函数(继承自 A)并且也是重载的,因此它会隐藏基类 A 的函数 h(),因此,我预计答案是 B::h(),但答案是 A::h(),我不知道为什么以及如何。
#include <iostream>
using namespace std;
class A
{
public:
virtual void f(int){cout << "A::f(int)" << endl;}
virtual void g(double){cout << "A::g(double)" << endl;}
int h(A*){cout << "A::h()" << endl; }
};
class B: public A
{
public:
void f(int){cout << "B::f(int)" << endl;}
virtual int h(B*){cout << "B::h()" << endl;}
};
class C : public B
{
void g(double){cout << "C::g(double)" << endl;}
int h(B*){cout << "C::h()" << endl; }
};
int main() {
A a_object;
B b_object;
C c_object;
A*pA;
pA = &b_object;
pA->h(&a_object);
pA->h(&b_object);
return 0;
}
答:
3赞
Vlad from Moscow
9/9/2023
#1
在类中,函数不是虚函数A
h
int h(A*){cout << "A::h()" << endl; }
在函数的两次调用中h
pA->h(&a_object);
pA->h(&b_object);
由于指针的类型,在类中搜索该函数。h
A
pA
A*pA;
由于该函数不是虚函数,因此指针是否由派生类的对象的地址分配并不重要。h
pA
B
pA = &b_object;
并且该函数接受指向派生类对象的指针作为参数B
pA->h(&b_object);
因为指向派生类的指针可以隐式转换为指向其基类的指针。
评论
h
在 中不是虚拟的。A
A*
A
A
virtual
A