我想知道为什么此函数打印“aba h()”而不是“son h()”,因为它是虚拟的。我以为该功能正在隐藏其他功能,但是它具有相同的签名。

class Aba: public Saba {
public:
    Aba(){cout << "Aba Ctor" << endl;}
    Aba(const Aba& a){cout << "Aba Copy Ctor" << endl;}
    ~Aba(){cout << "Aba Dtor" << endl;}
    virtual void g(){cout << "Aba g()" << endl;}
    virtual void f(int){cout << "Aba f(int)" << endl;}
    virtual void h(){cout << "Aba h()" << endl;}
};

class Son: public Aba {

public:
    Son(){cout << "Son Ctor" << endl;}
    Son(const Son& a){cout << "Son Copy Ctor" << endl;}
    ~Son(){cout << "Son Dtor" << endl;}
    void f(){cout << "Son f()" << endl;}
    void h(){cout << "Son h()" << endl;}
};

主要:
int main()

{
    Aba aba = Aba();
    aba.h();

    return 0;

}

最佳答案

virtual方法根据所引用的对象类型进行解析。在您的情况下,对象类型始终为,即 Aba,因为即使您分配了Son(),该对象也会被 slice 为Aba。因此,它打印Aba::h()方法。

使用引用和指针可以进行​​运行时动态绑定(bind)。在以下情况下,它将打印Son::h()

Son s;
Aba& r = s;
r.h(); // r referres to Son
Aba* p = &r; // or &s
p->h(); // p points/referred to Son

09-06 12:35