我想知道为什么此函数打印“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