您的位置:首页 > 编程语言 > C语言/C++

C++之虚函数

2016-06-12 12:23 435 查看
一、静多态

重载( C++对C的扩展之函数重载)就是静多态,是在编译的时候就知道了该调用哪个函数。这里重点说明第二部分:动多态的实现之一:虚函数。

二、虚函数

利用虚函数实现的动多态,有三个前提条件:

1、父类中有虚函数;

2、子类覆写(override)父类的虚函数;

3、子类对象赋值父类的指针。

给个例子:

class Shape{
public:
Shape(int x, int y):_x(x), _y(y){}
virtual void draw(){
cout << "draw from " << "( " << _x << "," << _y << " )" << endl;
}
protected:
int _x;
int _y;
};

class Rect: public Shape{
public:
Rect(int x, int y, int len, int wid):Shape(x, y), _len(len), _wid(wid){}
void draw(){
cout << "draw from " << "( " << _x << "," << _y << " )";
cout << " len = " << _len << "  wid = " << _wid << endl;
}
private:
int _len;
int _wid;
};

class Circle: public Shape{
public:
Circle(int x, int y, int rad):Shape(x, y), _radis(rad){}
void draw(){
cout << "draw from " << "( " << _x << "," << _y << " )";
cout << " radis = " << _radis << endl;
}
private:
int _radis;
};

int main()
{
Circle c(1, 2, 3);
Rect r(4, 5, 6, 7);
cout << "-----------子类对象赋给父类对象-------------" << endl;
Shape& ps1 = c;
ps1.draw();
ps1 = r;
ps1.draw();
cout << "-----------子类对象赋给父类对象引用-------------" << endl;
Shape ps2 = c;
ps2.draw();
ps2 = r;
ps2.draw();
cout << "-----------子类对象赋给父类对象指针-------------" << endl;
Shape *ps3 = &c;
ps3->draw();
ps3 = &r;
ps3->draw();
return 0;
}


输出结果:



这里稍微点一下父子类间的赋值兼容有三种形式:

1、子类对象赋给父类对象;

2、子类对象赋给父类对象的引用;

3、子类对象赋给父类对象的指针。

这里用这三种赋值兼容的方式进行了演示,显然只有子类对象赋给父类对象的指针实现了虚函数的动多态。

三、虚函数小结

1、声明虚函数是在父类中的成员函数前加virtual关键字。

2、子类可以覆写(override)父类的成员函数,也可以不覆写(不覆写用的就还是父类中的函数)。如果覆写,函数名、参数列表、返回类型必须相同或者是父类虚函数返回类型的子类,其函数前加不加virtual关键字都可以。

3、使用时用父类对象的指针指向子类对象,调用虚函数时,就是调用的子类实现的虚函数。

4、子类覆写的虚函数的访问权限不一定要与父类的虚函数权限一致(一般父类虚函数的访问权限都是public,因为虚函数主要用作对外的接口),主要看子类的用途。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: