使用多态指针调用函数

Ale*_*oft 1 c++ inheritance

#include <iostream>
class A{};
class AA:public A{};

struct X {
    void f(A *) {
        std::cout << "X::f(A*)\n";
    }
};

struct Y:public X {
    void f(A *) {
        std::cout << "Y::f(A*)\n";
    }
};

int main() {
    Y *y = new Y();
    X *x = new Y();
    const X *cx = new Y();

    y->X::f(new AA);
    x->f(new AA);
}
Run Code Online (Sandbox Code Playgroud)

打印:

X :: F(A*)

X :: F(A*)

我不明白为什么y->X::f(new AA),x->f(new AA)不会引起编译错误.X::f(A *)在两种情况下我都会调用它.但编译器选择使用此方法的原则是什么?函数重载多态?任何拇指规则?

JSF*_*JSF 5

如果f在X中被声明为虚拟,那么你的问题意味着你期望你会得到的行为.在某些语言中,这是唯一可行的行为.在C++中,您可以选择.

当你宣称f时,使用编译时类型,以便x-f(new AA)调用X::f ,因为xX*

如果你在X中声明了虚拟,x-f(new AA)则会调用,Y::f因为x指向Y.

对于你问题的另一个方面(为什么在为Y类型的对象调用X :: f时没有涉及错误),X是Y的基类,所以在每个对象中应该有一个类型为X的有效对象类型为Y,X对象应该可以与任何X方法一起使用.

在看到上面的注释之前,我错过了你的问题的第三个方面,编译器推断出需要一个隐式AA*转换,A*当你传递AA*给一个需要一个A*并且A是一个基类的方法时AA.该推论在很大程度上与X :: f和Y :: f之间的编译时间或运行时选择是分开的