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找代码区的函数.

results matching ""

    No results matching ""