在下面的程序中,我不明白答案 A::h() 和 A::h() [closed]

In the following program, I don't understand the answer A::h() and A::h() [closed]

提问人:Jasmeet Singh 提问时间:9/9/2023 最后编辑:Mark RotteveelJasmeet Singh 更新时间:9/9/2023 访问量:53

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2个月前关闭。

在我看来,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;
}
C++ OOP 继承虚 函数

评论

0赞 πάντα ῥεῖ 9/9/2023
stackoverflow.com/questions/274626/......
3赞 Jarod42 9/9/2023
h在 中不是虚拟的。A
0赞 Yksisarvinen 9/9/2023
当你有 时,编译器将查看函数声明。如果 中的函数是 ,它将查找 vtable 以找到正确的函数,否则它将简单地从中获取定义并调用它。隐藏与此无关。A*AAvirtualA

答:

3赞 Vlad from Moscow 9/9/2023 #1

在类中,函数不是虚函数Ah

int h(A*){cout << "A::h()" << endl; }

在函数的两次调用中h

pA->h(&a_object);
pA->h(&b_object);

由于指针的类型,在类中搜索该函数。hApA

A*pA;

由于该函数不是虚函数,因此指针是否由派生类的对象的地址分配并不重要。hpAB

   pA = &b_object;

并且该函数接受指向派生类对象的指针作为参数B

pA->h(&b_object);

因为指向派生类的指针可以隐式转换为指向其基类的指针。