Liny_@NotePad

沉迷ACG中

试一试Virtual……

YOYO posted @ 2009年7月26日 06:41 in 【C/C++】 with tags 虚函数 virtual , 1808 阅读

重温C++……去年这个时候是在用C++的经验看Java,今年反过来……囧

今天看下关于 虚函数 的部分……

在多态、重写这一方面,C++和Java不同的一点:如果子类重写了父类的方法(函数),多态 父类 A = new 子类 B的话,Java会自动调用子类的方法,而C++依然使用父类的方法,如果要使用子类的,必须申明该方法为virtual,即声明为虚函数,样例如下:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class A
  5. {
  6. public:
  7.         void read()
  8.         {
  9.                 cout<<"read from A"<<endl;
  10.         }
  11. };
  12.  
  13. class B:public A
  14. {
  15. public:
  16.         void read()
  17.         {
  18.                 cout<<"read from B"<<endl;
  19.         }
  20. };
  21.  
  22. class C:public A
  23. {
  24. public:
  25.         void read()
  26.         {
  27.                 cout<<"read from C"<<endl;
  28.         }
  29. };
  30.  
  31. int main()
  32. {
  33.         A* a = new A;
  34.         A* b = new B;
  35.         A* c = new C;
  36.         a->read();
  37.         b->read();
  38.         c->read();
  39.         return 0;
  40. }

这时打印出来的是三个read from A……

如果在A中的read方法前面加上virtual修饰,变成

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class A
  5. {
  6. public:
  7.         virtual void read()
  8.         {
  9.                 cout<<"read from A"<<endl;
  10.         }
  11. };
  12.  
  13. class B:public A
  14. {
  15. public:
  16.         void read()
  17.         {
  18.                 cout<<"read from B"<<endl;
  19.         }
  20. };
  21.  
  22. class C:public A
  23. {
  24. public:
  25.         void read()
  26.         {
  27.                 cout<<"read from C"<<endl;
  28.         }
  29. };
  30.  
  31. int main()
  32. {
  33.         A* a = new A;
  34.         A* b = new B;
  35.         A* c = new C;
  36.         a->read();
  37.         b->read();
  38.         c->read();
  39.         return 0;
  40. }

打印出来就分别read from A\B\C了……

这一点我还是觉得Java做的要好一些,避免了忘记用virtual修饰而造成的错误……

而纯虚函数 就是Java中的抽象方法了,和Java一样,C++中纯虚函数也必须在抽象类中定义,不过这个抽象类不用显式声明,只要类中有纯虚函数,则这个类自然会被认为是抽象类。样例如下:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class A
  5. {
  6. public:
  7.         virtual void read() = 0;
  8. };
  9.  
  10. class B:public A
  11. {
  12. public:
  13.         void read()
  14.         {
  15.                 cout<<"read from B"<<endl;
  16.         }
  17. };
  18.  
  19. class C:public A
  20. {
  21. public:
  22.         void read()
  23.         {
  24.                 cout<<"read from C"<<endl;
  25.         }
  26. };
  27.  
  28. int main()
  29. {
  30.         A* b = new B;
  31.         A* c = new C;
  32.         b->read();
  33.         c->read();
  34.         return 0;
  35. }

此时如果想要 A* a = new A,在编译的时候会报错,提示不能创建一个抽象类的对象。

关于纯虚函数的定义 感觉有点不习惯, virtual 函数类型 函数名(参数列表) = 0; 还是Java中的会习惯一些。。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter