#include<cstdio>
class Cup{
protected:
int capacity;
public:
Cup(int c){
capacity = c;
}
virtual int Capacity(){
printf("Parent class Capacity:%d \n", capacity);
return 0;
}
virtual void Name(){
printf("Cup\n");
}
void NonVirtualFun(){
printf("NonVirtualFun\n");
}
};
class PlasticCup : public Cup{
public:
PlasticCup(int c):Cup(c){}
int Capacity(){
printf("PlasticCup class Capacity:%d \n", capacity);
return 0;
}
void Name(){
printf("Plastic Cup\n");
}
virtual void Brand(){
printf("wahaha\n");
}
};
class Glass: public Cup{
public:
Glass(int c):Cup(c){}
int Capacity(){
printf("Glass class Capacity:%d \n", capacity);
return 0;
}
//void Name(){
// printf("Glass \n");
//}
virtual void PlaceOfOrigin(){
printf("China\n");
}
};
void uncommonPrint(Cup* cup){
printf("\n-----\n");
typedef void (*NonVirtualFun_FUN)(void*);
typedef int (*Capatity_FUN)(void*);
typedef void (*Name_FUN)(void*);
typedef void*ADRESS;
NonVirtualFun_FUN foo=(NonVirtualFun_FUN)(&Cup::NonVirtualFun);//barζεε½ζ°δΈΊιθε½ζ°
foo((void*)cup);
ADRESS *vtable_addr=*((ADRESS**)(cup));
Capatity_FUN fooCapacity=(Capatity_FUN)*(vtable_addr);
fooCapacity((void*)cup);
Name_FUN nameFoo=(Name_FUN)*(vtable_addr+1);
nameFoo((void*)cup);
printf("----\n\n");
}
void routinePrint(Cup*c){
c->NonVirtualFun();
c->Capacity();
c->Name();
}
int main(){
Cup* cup = new PlasticCup(3);
routinePrint(cup);
uncommonPrint(cup);
delete cup;
printf("\n===========================\n");
cup=new Glass(5);
routinePrint(cup);
uncommonPrint(cup);
delete cup;
return 0;
}