#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 *)在两种情况下我都会调用它.但编译器选择使用此方法的原则是什么?函数重载多态?任何拇指规则?
如果f在X中被声明为虚拟,那么你的问题意味着你期望你会得到的行为.在某些语言中,这是唯一可行的行为.在C++中,您可以选择.
当你宣称f时,使用编译时类型,以便x-f(new AA)调用X::f ,因为x是X*
如果你在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之间的编译时间或运行时选择是分开的
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |