Chinaunix首页 | 论坛 | 博客
  • 博客访问: 491972
  • 博文数量: 72
  • 博客积分: 1851
  • 博客等级: 上尉
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-16 17:50
文章分类

全部博文(72)

文章存档

2013年(1)

2012年(17)

2011年(51)

2010年(3)

分类: C/C++

2011-06-01 22:00:43

 虚函数重载

在父类派生出多个子类后,由于每个子类之间需要进行运算,或操作,就可以采用虚类的重载,具体看thinking in C++中的例子:

  1. #include <iostream>
  2. #include <string>

  3. using namespace std;

  4. class Matrix;
  5. class Scalar;
  6. class Vector;

  7. class Math{
  8. public:
  9. virtual Math& operator*(Math& rv)=0;
  10. virtual Math& multiply(Matrix*)=0;
  11. virtual Math& multiply(Scalar*)=0;
  12. virtual Math& multiply(Vector*)=0;
  13. virtual ~Math(){}
  14. };
  15. class Matrix:public Math{
  16. public:
  17.  Math& operator*(Math& rv){
  18.     return rv.multiply(this);
  19. }
  20. Math& multiply(Matrix*){
  21.  cout<<"Matrix*Matrix"<<endl;    
  22.  return *this;
  23. }
  24. Math& multiply(Scalar*){
  25.   cout<<"Scalar*Scalar"<<endl;
  26.  return *this;
  27. }
  28. Math& multiply(Vector*){
  29.  cout<<"Vector*Vector"<<endl;
  30.  return *this;
  31. }
  32. };
  33. class Scalar:public Math{
  34. public:
  35.  Math& operator*(Math& rv){
  36.     return rv.multiply(this);
  37. }
  38. Math& multiply(Matrix*){
  39.  cout<<"Matrix*Matrix"<<endl;    
  40.  return *this;
  41. }
  42. Math& multiply(Scalar*){
  43.   cout<<"Scalar*Scalar"<<endl;
  44.  return *this;
  45. }
  46. Math& multiply(Vector*){
  47.  cout<<"Vector*Vector"<<endl;
  48.  return *this;
  49. }
  50. };
  51. class Vector:public Math{
  52. public:
  53.  Math& operator*(Math& rv){
  54.     return rv.multiply(this);
  55. }
  56. Math& multiply(Matrix*){
  57.  cout<<"Matrix*Matrix"<<endl;    
  58.  return *this;
  59. }
  60. Math& multiply(Scalar*){
  61.   cout<<"Scalar*Scalar"<<endl;
  62.  return *this;
  63. }
  64. Math& multiply(Vector*){
  65.  cout<<"Vector*Vector"<<endl;
  66.  return *this;
  67. }
  68. };
  69. int main()
  70. {
  71. Matrix m;Vector v;Scalar s;
  72. Math* math[]={&m,&v,&s};
  73. for(int i=0;i<3;i++)
  74.  for(int j=0;j<3;j++)

 运行结构如下:

  1. Matrix*Matrix
  2. Matrix*Matrix
  3. Matrix*Matrix
  4. Vector*Vector
  5. Vector*Vector
  6. Vector*Vector
  7. Scalar*Scalar
  8. Scalar*Scalar
  9. Scalar*Scalar

 如果在声明的虚函数后面添加”=0”,则标明该函数为纯虚函数,而对应的类为抽象类,如果子类没有完全实现父类的纯虚函数,则子类也为抽象类。同样的,析构函数也可以声明为虚函数,而且在基类中的析构函数必须为虚函数,否则就会出现内存泄漏,析构函数也可以声明为纯虚函数,但是还是要在基类定义中给予实现,否则就会出现错误,而且在析构函数中调用虚函数一样会失效,因为虚函数需要类的继承层次性,但是构造函数是从基类到子类,而析构函数是子类到基类,析构到最后子类都已经释放了,这样当然就不能调用析构函数了。虚析构函数的意义在于当声明基类为抽象类而没有方法声明为纯虚函数时,纯虚析构函数就派上了用场。

阅读(855) | 评论(0) | 转发(0) |
0

上一篇:C++虚函数(一)

下一篇:TCP状态转换图

给主人留下些什么吧!~~