虚函数不进入基数class

virtual function doesn't enter to the base class

我想知道为什么这个函数打印 "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 方法根据所引用的对象类型进行解析。在你的例子中,对象类型是 always Aba 因为即使你分配 Son(),对象也会被分割成 Aba。因此它打印 Aba::h() 方法。

可以使用引用和指针进行运行时动态绑定。在以下情况下,它将打印 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

虚函数解析为对象的动态类型的相应函数,而不是非虚函数那样的静态类型:

Aba && one = Aba();
// static type: reference to Aba
// dynamic type of referenced object: Aba

因此,虚函数解析为定义为 Aba 成员的函数。

Aba && two = Son();
// static type: reference to Aba
// dynamic type of referenced object: Son

假设存在这样的定义,现在虚函数将解析为 Son 中的定义。

这里是用静态对象调用函数h,因此这个函数的调用只在编译时解析,与它无关功能是虚拟的。此调用已绑定。

仅在动态对象的情况下,绑定在运行时完成,查看指针指向哪个对象。

Aba *ptr = new Son;
ptr->h(); //Ptr is pointing to Son, hence Son::h() will get called.