C++多态的条件:
1.必须是指针或者引用.
2.向上转型.
3.子类覆写对应父类的函数是虚函数.
class BaseClass{
public:
virtual void display\(\){
cout<<"BaseClass"<<endl;
}
};
class SubClass1 : public BaseClass{
public:
void display\(\){
cout<<"SubClass1"<<endl;
}
};
class SubClass2 : public BaseClass{
public:
void display\(\){
cout<<"SubClass2"<<endl;
}
};
int main()
{
//1.指针或者应用.
//2.向上转型.
//3.覆写了父类的virtual函数.
//1.指针或者应用.
BaseClass *pbc;
SubClass1 sc1;
SubClass2 sc2;
//2.向上转型.
pbc =&sc1;
//3.覆写了父类的virtual函数.
pbc->display\(\);
//2.向上转型.
pbc = &sc2;
//3.覆写了父类的virtual函数.
pbc->display\(\);
//1.指针或者应用.
//2.向上转型.
BaseClass &r1 = sc1;
BaseClass &r2 = sc2;
//3.覆写了父类的virtual函数.
r1.display\(\);
r2.display\(\);
return 0;
}
Java多态的条件:由于java中的方法默认就是虚函数,默认的对象就是引用.
1.向上转型.
2.子类覆写对应父类的函数.
class BaseClass{
void display\(\){
System.out.println\("BaseClass"\);
}
}
class SubClass1 extends BaseClass{
void display\(\){
System.out.println\("SubClass1"\);
}
}
class SubClass2 extends BaseClass{
void display\(\){
System.out.println\("SubClass2"\);
}
}
public class Test10 {
public static void main\(String\[\] args\) {
// TODO Auto-generated method stub
BaseClass cl = new SubClass1\(\);
//1.向上转型(SubClass1->BaseClass)
//2.SubClass1覆写BaseClass中的display()方法
cl.display\(\);
cl = new SubClass2\(\);
cl.display\(\);
}
}
VFT:虚拟函数表
当Java编译某个类别(class)时,会替该类别建立一个VFT(virtual function table)表,然后把各函数的地址逐一存放在表格中,就称为VFT表了.其目的是供程序在执行期间,可以从表格中找出适当的函数的地址,并将之连结起来.
1.每个类别都含有一个VFT表.
2.类别之建构者在当生对象时,对象会指向(或参考到)该类别之VFT表.
X是类别(Class). 物件1和物件2是 X类别的对象.
VFT里面放的是引用(指针)指向代码区某个函数的地址.
class Product{
int number = 0;
void printInfo\(\){
System.out.println\("printInfo"\);
}
void updatInfo\(int nm\){
number = nm;
printInfo\(\);
}
}
public class Test11 {
public static void main\(String\[\] args\) {
// TODO Auto-generated method stub
Product pt = new Product\(\);
pt.updatInfo\(30\);
}
}
如果加上继承关系VFT会有所变化如下:
class Product{
int number = 0;
void printInfo\(\){
System.out.println\("printInfo"\);
}
void updatInfo\(int nm\){
number = nm;
printInfo\(\);
}
}
class SubClass extends Product{
void printInfo\(\){
System.out.println\("SubClass"\);
}
void showSelf\(\){
System.out.println\("showSelf"\);
}
}
public class Test11 {
public static void main\(String\[\] args\) {
// TODO Auto-generated method stub
Product pt = new SubClass \(\);
pt.updatInfo\(30\);
}
}
对应的调用流程即是:
对象找到VFT,VFT找代码区的函数.