class XYPos{ ... }; //x,y point
class Shape{
public:
Shape();
virtual ~Shape();
virtual void render();//virtual 表示这个render()和子类的render()有联系
void move(const XYPos&);
virtual void resize();
protected:
XYPos center;
};
class Ellipse:public Shape{
public:
Ellipse(float maj,float minr);
virtual void render();//这个virtual可加可不加,父类的函数有virtual,子类的同名函数都是virtual类型的
protected:
float major_axis,minor_axis;
};
class Circle:public Ellipse{
public:
Circle(float radius):Ellipse(radius,radius){ }
virtual void render();
};
void render(Shape* p){//p是多态的,如果render是virtual的,则p是动态绑定,否则是静态绑定,动态绑定构成了多态
p->render();
}
void func(){
Ellipse ell(10,20);
ell.render();
Circle circ(40);
circ.render();
render(&ell);//upcast virtual的作用,通过指针或者引用调用函数时,不能直接使用写好的Shape类中的函数,而是要到运行时,调用Ellipse类中的函数
render(&circ);//调用Circle类中的函数
}
任何类只要有虚函数,这个类就会比正常的类大一点。
#include <iostream>
using namespace std;
class A{
public:
A():i(10){}
virtual void f(){ cout<<"A::f()"<<i<<endl; }//含有virtual函数的类,内存最上面是指向虚函数的指针,之后才是i的值
int i;
};
class B:public A{
public:
B():j(20){}
virtual void f(){cout<<"B::f()"<<j<<endl;}
int j;
}
int main(){
A a;
B b;
A* p=&b;
p->f(); //p会指向b的f()
a=b;
a.f();//a的f(),通过指针调用virtual才会是动态绑定,通过.调用不是动态绑定
p=&a;
p->f();//a的f()
cout<<sizeof(a)<<endl;//8
int *p=(int*)&a;//*p = 835680
p++;
cout<<*p<<endl;//*p=10
}
如果类中有virtual函数,则析构必须也是virtual
class Base{
public:
virtual void func();
};
class Derived:public Base{
public:
virtual void func();//overrides 覆盖
};
void Derived::func(){
cout<<"In Derived::func!";
Base::func();//调用父类的func(),直接写的话,默认调用Derived的func()
}
class Expr{
public:
virtual Expr* newExpr();
virtual Expr& clone();
virtual Expr self();
};
class BinaryExpr:public Expr{
public:
virtual BinaryExpr* newExpr(); //对,返回指针
virtual BinaryExpr& clone(); //对,返回引用
virtual BinaryExpr self(); //错,不能直接返回对象本身
};
//通过指针和引用才构成向上造型