40、虚函数
#include<iostream.h>
class A
{
public:
A() { cout<<"A has been called!"<<endl; }
virtual void f() { cout<<"A::f() called."<<endl; }
};
class B:public A
{
public:
B() { f(); cout<<"B has been called!"<<endl; }
void g() { f(); }
};
class C:public B
{
public:
C() { cout<<"C has been called!"<<endl; }
virtual void f() { cout<<"C::f() called."<<endl; }
};
void main()
{
C c;
c.g();
}
总结:a.在继承中C调用到父类B的成员函数,要先调用B的构造函数,B的构造调用了虚函数f(),
由于B没有f()函数,所以调用基类A的f()函数,但之前先调用A的构造函数。
b.最先调用基类构造函数,再调用B和C类构造函数。
41、纯虚函数
#include<iostream.h>
class Number
{
public:
Number(int i) { val=i; }
virtual void Show()=0; //=0,申明为虚函数
protected:
int val;
};
class Hextype:public Number
{
public:
Hextype(int i):Number(i) {}
virtual void Show() { cout<<hex<<val<<dec<<endl; }
};
class Dectype:public Number
{
public:
Dectype(int i):Number(i) {}
virtual void Show() { cout<<dec<<val<<endl; }
};
class Octtype:public Number
{
public:
Octtype(int i):Number(i) {}
virtual void Show() { cout<<oct<<val<<endl; }
};
void fun(Number &n)
{
n.Show();
}
void main()
{
Dectype d(50);
fun(d);
Hextype h(16);
fun(h);
Octtype o(9);
fun(o);
}
总结:1.在基类中不能为虚函数给出一个有意义的实现时,可以申明为纯虚函数,其实现留待派生类完成。
2.作用:为派生类提供一个一致的接口。
3.申明格式:
class <类名>
{
virtual <函数名> (<参数表>)=0; //纯虚函数申明
}
42.纯虚函数二
#include<iostream.h>
class Point
{
public:
Point(int i=0,int j=0) { x0=i;y0=j; }
virtual void Set()=0;
virtual void Draw()=0;
protected:
int x0,y0;
};
class Line:public Point
{
public:
Line(int i=0,int j=0,int m=0,int n=0):Point(i,j)
{ x1=m;y1=n; }
void Set() { cout<<"Line::Set() called."<<endl; }
void Draw() { cout<<"Line::Draw() called."<<endl; }
protected:
int x1,y1;
};
class Ellipse:public Point
{
public:
Ellipse(int i=0,int j=0,int p=0,int q=0):Point(i,j)
{ x2=p;y2=q; }
void Set() { cout<<"Ellipse::Set() called."<<endl; }
void Draw() { cout<<"Ellipse::Draw() called."<<endl; }
protected:
int x2,y2;
};
void DrawObj(Point* p)
{
p->Draw();
}
void SetObj(Point *p)
{
p->Set();
}
void main()
{
Line *lineobj = new Line; //设置虚函数,可以完成对不同子类继承对象,使用一个函数对其进行不同的初始化
Ellipse *ellipseobj = new Ellipse; //这个知识点承接虚函数,动态束定
DrawObj(lineobj);
DrawObj(ellipseobj);
cout<<endl;
SetObj(lineobj);
SetObj(ellipseobj);
cout<<endl<<"Redraw the object..."<<endl;
DrawObj(lineobj);
DrawObj(ellipseobj);
}
总结:a.设置虚函数,可以完成对不同子类继承对象,使用一个函数对其进行不同的初始化
b.这个知识点承接虚函数,动态束定
#include<iostream.h>
class A
{
public:
A() { cout<<"A has been called!"<<endl; }
virtual void f() { cout<<"A::f() called."<<endl; }
};
class B:public A
{
public:
B() { f(); cout<<"B has been called!"<<endl; }
void g() { f(); }
};
class C:public B
{
public:
C() { cout<<"C has been called!"<<endl; }
virtual void f() { cout<<"C::f() called."<<endl; }
};
void main()
{
C c;
c.g();
}
总结:a.在继承中C调用到父类B的成员函数,要先调用B的构造函数,B的构造调用了虚函数f(),
由于B没有f()函数,所以调用基类A的f()函数,但之前先调用A的构造函数。
b.最先调用基类构造函数,再调用B和C类构造函数。
41、纯虚函数
#include<iostream.h>
class Number
{
public:
Number(int i) { val=i; }
virtual void Show()=0; //=0,申明为虚函数
protected:
int val;
};
class Hextype:public Number
{
public:
Hextype(int i):Number(i) {}
virtual void Show() { cout<<hex<<val<<dec<<endl; }
};
class Dectype:public Number
{
public:
Dectype(int i):Number(i) {}
virtual void Show() { cout<<dec<<val<<endl; }
};
class Octtype:public Number
{
public:
Octtype(int i):Number(i) {}
virtual void Show() { cout<<oct<<val<<endl; }
};
void fun(Number &n)
{
n.Show();
}
void main()
{
Dectype d(50);
fun(d);
Hextype h(16);
fun(h);
Octtype o(9);
fun(o);
}
总结:1.在基类中不能为虚函数给出一个有意义的实现时,可以申明为纯虚函数,其实现留待派生类完成。
2.作用:为派生类提供一个一致的接口。
3.申明格式:
class <类名>
{
virtual <函数名> (<参数表>)=0; //纯虚函数申明
}
42.纯虚函数二
#include<iostream.h>
class Point
{
public:
Point(int i=0,int j=0) { x0=i;y0=j; }
virtual void Set()=0;
virtual void Draw()=0;
protected:
int x0,y0;
};
class Line:public Point
{
public:
Line(int i=0,int j=0,int m=0,int n=0):Point(i,j)
{ x1=m;y1=n; }
void Set() { cout<<"Line::Set() called."<<endl; }
void Draw() { cout<<"Line::Draw() called."<<endl; }
protected:
int x1,y1;
};
class Ellipse:public Point
{
public:
Ellipse(int i=0,int j=0,int p=0,int q=0):Point(i,j)
{ x2=p;y2=q; }
void Set() { cout<<"Ellipse::Set() called."<<endl; }
void Draw() { cout<<"Ellipse::Draw() called."<<endl; }
protected:
int x2,y2;
};
void DrawObj(Point* p)
{
p->Draw();
}
void SetObj(Point *p)
{
p->Set();
}
void main()
{
Line *lineobj = new Line; //设置虚函数,可以完成对不同子类继承对象,使用一个函数对其进行不同的初始化
Ellipse *ellipseobj = new Ellipse; //这个知识点承接虚函数,动态束定
DrawObj(lineobj);
DrawObj(ellipseobj);
cout<<endl;
SetObj(lineobj);
SetObj(ellipseobj);
cout<<endl<<"Redraw the object..."<<endl;
DrawObj(lineobj);
DrawObj(ellipseobj);
}
总结:a.设置虚函数,可以完成对不同子类继承对象,使用一个函数对其进行不同的初始化
b.这个知识点承接虚函数,动态束定