看一下以下示例:
Class A{
virtual foo(int& a){ cout << "this is A";}
}
Class B: public A{
foo(int a){cout << "this is B";}
}
主要部分内的:
int prm= 6;
A* myA= new B();
myA->foo(prm);
当我测试这段代码时,看起来A的foo方法就是发生的那个, 即使我改变foo的签名,在A处取“int”而在B处取“double”并使用myA.foo(5.5),它仍然使用A的foo。 你能解释一下“幕后”会发生什么,为什么编译器会假设我想要的方法是A的foo,即使myA的动态类型是B?
请注意,在这个问题中我使用A * myA,因此myA的静态类型是基类。在标记为重复的问题中,使用B * myA(对象的静态类型是派生类,而不是基类)。此代码编译(再次,与标记为重复的问题不同),但在运行时时以意外的方式运行。