#include<iostream> using namespace std; class A{ public: virtual ~A(){f();} virtual void f(){cout<<"This is A virtual"<<endl;} void g(){cout<<"This is A no-virtual"<<endl;} }; class B:public A{ public: ~B(){f();} virtual void f(){cout<<"This is B virtual"<<endl;} void g(){cout<<"This is B no-virtual"<<endl;} }; int main(){ //如果是virtual方法的话,和Java中多态现象一样 A* p = new B; p->f(); A* q = new A; q->f(); //如果不是virtual方法,那么只看引用是什么类型 A* w = new A; w->g(); A* x = new B; x->g(); cout<<"====delete all object!==="<<endl; delete p; delete q; delete w; delete x; return 0; }
再看一个例子:
#include <iostream> using namespace std; class Base{ public: Base(int j) : i(j) {} virtual ~Base() {} void func1(){ cout<<"Base func1"<<endl; i *= 10; //但是Base的func2是virtual,所以要看真正的对象是什么类型 //如果是Child类型对象,那么就应该调用Child的func2函数 func2(); } int getValue(){ return i; } protected: virtual void func2(){ i++; cout<<"Base func2"<<endl; } protected: int i; }; class Child : public Base { public: Child(int j) : Base(j) {} void func1(){ cout<<"Child func1"<<endl; i *= 100; func2(); } protected: void func2(){ i += 2; cout<<"Child func2"<<endl; } }; int main(void){ Base *pb = new Child(1); pb->func1(); //func1不是虚函数,所以这里引用是Base类型,就调用Base的func1函数 cout<<pb->getValue()<<endl; delete pb; return 0; }