星期三, 八月 19, 2009

gcc编译 vtable undefined reference错误

通过在基类中定义虚函数virtual,然后要求子类覆盖,从而实现多态是常见技术

但是这种定义,在link的时候出现 vtable ..undefined reference to 的错误,原因是gcc实现
C++规范的时候的问题,解决这个问题,是需要必须顶一个空的virtual,这样造成了,编译器
检查强迫子类覆盖的失效,非常的不爽。virtual myfunction (){}; 语法来规避错误
有人建议使用 virtual myfunction ()=0;但没有成功


http://gcc.gnu.org/faq.html#vtables
  1. class Port
  2. {
  3. private:
  4. char *brand;
  5. char style[20]; // i.e. tawny, ruby, vintage
  6. int bottles;
  7. public:
  8. Port(const char *br = "none", const char *st = "none", int b = 0);
  9. Port(const Port &p); // copy constructor
  10. virtual ~Port() { delete [] brand;}
  11. Port & operator=(const Port &p);
  12. Port & operator+=(int b);
  13. Port & operator-=(int b);
  14. int BottleCount() const {return bottles;}
  15. virtual void Show() const;
  16. friend ostream &operator<<(ostream &os, const Port &p);
  17. };
  18. class VintagePort : public Port
  19. {
  20. private:
  21. char * nickname; // i.e. The Noble, or Old Velvet, etc.
  22. int year; // vintage year
  23. public:
  24. VintagePort();
  25. VintagePort(const char *br, int b, const char *nn, int y);
  26. VintagePort(const VintagePort &vp);
  27. ~VintagePort() {delete [] nickname;}
  28. void Show() const;
  29. friend ostream & operator<<(ostream &os, const VintagePort & vp);
  30. };