java代码:
public class Father
{
public void function()
{
System.out.println("father");
}
}
public class Child extends Father
{
public void function()
{
System.out.println("child");
}
}
Father f = new Child();
f.function();调用的是哪个类的方法
c++代码:
class Father
{
public:
virtual void function()
{
count<<"Father"<<endl;
}
void A(){...}
}
class Child : public Father
{
public:
void functino()
{
count<<"child"<<endl;
}
vodi A(){...}
}
Father *p = new Child();
p->function();
如果不加virtual 是调用的哪个类的方法,加了virtual调用的是哪个类的方法
根据java的多态性,调用的是Child类的function方法
c++不加virtual,调用的是Father类的function方法
加了virtual,调用的是child类的function方法
在java 中所有的方法都是虚拟函数
Child c;
Father *p = &c;
p->function();//子类方法
p->A();//父类方法
Child *c = &c;
c->function();//子类方法
c->A();//子类方法
p和c指向同一地址,按道理应该输出一样的答案,事实运行结果输出却不同。
这是因为决定p和c调用函数运行结果的不是他们指向的地址,而是他们的指针类型。“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”(C++ Primer 3rd Edition)。p是基类指针,c是派生类指针,c的所有函数调用都只是调用自己的函数,和多态性无关,所以c的所有函数调用的结果都输出Child;p的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的,所以有virtual的f函数调用输出Chikd::,没有virtual则还是输出Father。