Chinaunix

标题: 内联纯虚函数的定义 [打印本页]

作者: zwylinux    时间: 2007-04-04 18:21
标题: 内联纯虚函数的定义
c++编程思想里边有提到,内联的纯虚函数定义是非法的
我做了个测试


  1. class Shape{
  2. public:
  3.     virtual void draw() = 0{
  4.         std::cout <<"Shape::draw()\n";
  5.     }
  6. };
复制代码

这种情况编译会出错,这个没有疑问


  1. class Shape{
  2. public:
  3.     virtual void draw() = 0;
  4. };
  5. inline void Shape::draw(){
  6.     std::cout <<"Shape::draw()\n";
  7. }
复制代码

而这种情况编译就没有错误了,不解

我觉得上面两个都是把draw函数定义成一个内联的函数。有什么不同吗
作者: westgarden    时间: 2007-04-04 18:58
不管上面哪种情况,当你创建对象时就会报错。
作者: 飞灰橙    时间: 2007-04-04 19:14
原帖由 westgarden 于 2007-4-4 18:58 发表
不管上面哪种情况,当你创建对象时就会报错。


那是自然
作者: westgarden    时间: 2007-04-04 19:22
楼主所说的2种情况,在不同的编译器上情况有所不同。
g++上,如楼主所说;
VC 8.0的编译器上,则都没出错。

[ 本帖最后由 westgarden 于 2007-4-4 19:24 编辑 ]
作者: tyc611    时间: 2007-04-04 21:30
标题: 回复 1楼 zwylinux 的帖子
可能是对第二种情况,编译器直接把定义忽略了
作者: zwylinux    时间: 2007-04-04 21:45
原帖由 tyc611 于 2007-4-4 21:30 发表
可能是对第二种情况,编译器直接把定义忽略了


还有没有其他的解释?
作者: emacsnw    时间: 2007-04-05 07:03
原帖由 zwylinux 于 2007-4-4 05:45 发表


还有没有其他的解释?


研究这问题感觉没什么意义,纯虚函数和函数定义本来就是矛盾的,编译器想报错就报错,想忽略哪个就忽略哪个,呵呵。
作者: 飞灰橙    时间: 2007-04-05 10:58
原帖由 zwylinux 于 2007-4-4 21:45 发表


还有没有其他的解释?


这个有个用处。
比如想定义一个纯虚的接口,"其他类"从这个接口继承。
但C++很不巧的是,"其他类" 没有办法实例化了, link过不去, 因为它析构时要调用基类的析构,
所以虽然是纯虚函数, 却还是加上函数体.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2