jant
2003-11-10, 14:42
纯虚函数就是 初始化为0的虚函数?
在使用的时候,抽象基类的虚函数一定要是纯虚函数么?有什么区别阿??
分身乏术的死猫
2003-11-10, 14:57
[10 Nov 2003 14:42:51 +0800]"jant"
的字符终端显示内容如下:
:纯虚函数就是 初始化为0的虚函数?
:在使用的时候,抽象基类的虚函数一定要是纯虚函数么?有什么区别阿??
正确的说法是,只要有一个成员函数是纯虚函数,那么这个类就是抽象类。
如果没有重新定义基类的纯虚函数,那么这个派生类也是抽象类。
纯虚函数和虚函数的使用本身没有什么太大的区别,区别在于抽象类的使用。
抽象类是不能创建对象实例的。
应该把纯虚函数看成是实现抽象类这个概念的语言机制。
:
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
zhangjun
2003-11-10, 15:25
你的意思是不是就是说 纯虚函数主要的目的就是让一个类无法实例化。
其他方面和虚函数一样是吗?
"分身乏术的死猫" 写入消息新闻
:v2duqv41fac3ahlc9s7mjdj3ug3pje6e69@4ax.com...
> [10 Nov 2003 14:42:51 +0800]"jant"
> 的字符终端显示内容如下:
> 抽象类是不能创建对象实例的。
>
> 应该把纯虚函数看成是实现抽象类这个概念的语言机制。
>
> :
那是不是说
抽象类,是有至少一个成员函数是纯虚函数的类?
还是说用 用abstract 修饰的类 就是抽象类(是不是C++没有这个关键字)?
另,是否存在抽象类,它的成员函数 既有纯虚函数,又有虚函数?比如,抽象基类a
中,有个draw函数。希望不同的子类能够重定义它来做各自的draw.那在a中该将draw定
义成虚函数还是纯虚函数??
分身乏术的死猫
2003-11-10, 18:24
[10 Nov 2003 15:25:12 +0800]"zhangjun"
的字符终端显示内容如下:
:你的意思是不是就是说 纯虚函数主要的目的就是让一个类无法实例化。
这倒不是这么说,不能实例化的方法有多种,例如私有构造函数等等。
确切地说,纯虚函数是为了表达“抽象类”这种概念,
他提供了一种成员函数,实际上不做任何事情,从语义上来说等效为空的函数体。
但是如果使用空函数体定义成员函数,那么这个类就可以被实例化。
这就好像一个抽象类可以被实例化了,与通常的大家的概念不同。
由于派生类必须调用基类的构造函数,那么在这种情况下,如果没有纯虚函数的支持,
必须强制要求基类的构造函数声明为保护的,那么派生类才可以实例化。
出于便利性的考虑,就弄了个纯虚函数这样的东西出来。
我想,我近期读过的C++书籍都比我这里介绍的要概念清晰的多。
:
:其他方面和虚函数一样是吗?
:"分身乏术的死猫" 写入消息新闻
::v2duqv41fac3ahlc9s7mjdj3ug3pje6e69@4ax.com...
:> [10 Nov 2003 14:42:51 +0800]"jant"
:> 的字符终端显示内容如下:
:
:> 抽象类是不能创建对象实例的。
:>
:> 应该把纯虚函数看成是实现抽象类这个概念的语言机制。
:>
:> :
:
:
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
分身乏术的死猫
2003-11-10, 18:26
[10 Nov 2003 16:07:17 +0800]"jant"
的字符终端显示内容如下:
:那是不是说
:抽象类,是有至少一个成员函数是纯虚函数的类?
是的。
:还是说用 用abstract 修饰的类 就是抽象类(是不是C++没有这个关键字)?
没有这个关键字。
:
:另,是否存在抽象类,它的成员函数 既有纯虚函数,又有虚函数?比如,抽象基类a
是的。
:中,有个draw函数。希望不同的子类能够重定义它来做各自的draw.那在a中该将draw定
:义成虚函数还是纯虚函数??
:
都可以,依赖于A是否应该被允许实例化。
你的这个例子和你的问题一定关联都没有。
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
Freemine
2003-11-10, 21:12
"分身乏术的死猫" 写入消息新闻
:juouqvk6vdfrglgv8kr8dhmltsckov5cg1@4ax.com...
> [10 Nov 2003 15:25:12 +0800]"zhangjun"
> 的字符终端显示内容如下:
> :你的意思是不是就是说 纯虚函数主要的目的就是让一个类无法实例化。
>
> 这倒不是这么说,不能实例化的方法有多种,例如私有构造函数等等。
好象具有私有构造函数的类也可以被实例化的吧。 加上'不能被外部(客户)
实例化'可能会准确一点吧。
> 他提供了一种成员函数,实际上不做任何事情,从语义上来说等效为空的函数体。
> 但是如果使用空函数体定义成员函数,那么这个类就可以被实例化。
空的函数体是指的什么呢? 是不是说没有被定义/实现的函数呢?
实际上,初虚函数也是可以被实现被调用的。
> 由于派生类必须调用基类的构造函数,那么在这种情况下,如果没有纯虚函数的支
持,
> 必须强制要求基类的构造函数声明为保护的,那么派生类才可以实例化。
> 出于便利性的考虑,就弄了个纯虚函数这样的东西出来。
我以为:并不是为了更便利地阻止类的实例化而引入纯虚函数。 如果只是出于此,那
用户是否还有必要写这个类呢?纯虚函数的引入是为了给C++提供一个接口的实现方
式,
同时又可以少加一个关键字吧。
"分身乏术的死猫" 写入邮件
news:vfpuqv4dhnn5l4muae42s8qcfq2s5e7dot@4ax.com...
> [10 Nov 2003 16:07:17 +0800]"jant"
> 的字符终端显示内容如下:
> :那是不是说
> :抽象类,是有至少一个成员函数是纯虚函数的类?
>
> 是的。
>
我认为,不能实例化的类是抽象类。含有纯虚函数的类是抽象类的一种。
> +----------------+
> | 万 兽 皆 下 品 |
> | 唯 有 豹 最 高 |
> +----------------+
>
> 欲要了解死猫的执行结果,
> 请在命令行输入:
> ~shorn/
Yan Libin
2003-11-11, 23:31
问一下,为何c++中有virtual关键字,而没有abstract关键字?
抽象函数就写成=NULL, =0这样的,甚至让有些变态故意写成类似 virtual
foo()=(2==(3-1));或更复杂的形式。
就为了省一个关键字?要么都用关键字,要么都定义成类似=0这样莫名其妙的样子。
c++语法方面真是不够严谨。
"分身乏术的死猫" 写入邮件
news:vfpuqv4dhnn5l4muae42s8qcfq2s5e7dot@4ax.com...
> [10 Nov 2003 16:07:17 +0800]"jant"
> 的字符终端显示内容如下:
> :那是不是说
> :抽象类,是有至少一个成员函数是纯虚函数的类?
>
> 是的。
>
> :还是说用 用abstract 修饰的类 就是抽象类(是不是C++没有这个关键字)?
>
> 没有这个关键字。
>
> :
zhang yandong
2003-11-12, 09:20
纯虚函数这个东东,主要用来声明抽象接口。接口在派生类中实现。一些设计模式的实
现,主要是依赖抽象接口。
"zhangjun" 写入邮件
news:3faf3d58$1_1@News.Newsfan.Net...
> 你的意思是不是就是说 纯虚函数主要的目的就是让一个类无法实例化。
>
> 其他方面和虚函数一样是吗?
> "分身乏术的死猫" 写入消息新闻
> :v2duqv41fac3ahlc9s7mjdj3ug3pje6e69@4ax.com...
> > [10 Nov 2003 14:42:51 +0800]"jant"
> > 的字符终端显示内容如下:
>
> > 抽象类是不能创建对象实例的。
> >
> > 应该把纯虚函数看成是实现抽象类这个概念的语言机制。
> >
> > :
>
>
>
分身乏术的死猫
2003-11-12, 13:32
[11 Nov 2003 23:31:56 +0800]"Yan Libin"
的字符终端显示内容如下:
:问一下,为何c++中有virtual关键字,而没有abstract关键字?
:抽象函数就写成=NULL, =0这样的,甚至让有些变态故意写成类似 virtual
:foo()=(2==(3-1));或更复杂的形式。
:
:就为了省一个关键字?要么都用关键字,要么都定义成类似=0这样莫名其妙的样子。
是的,因为大多数反对者讨厌增加关键字,所以最初设计的时候,能少用就尽量少用。
:
:c++语法方面真是不够严谨。
那是因为C的语法不够严谨,语法的优美和严谨从来就不是C++的设计目标。
如果实在很关心诸如此类的语言设计的问题,参考读物是<>,
这是唯一的一本介绍程序设计语言的设计思想的书籍。
:
:
:
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
==============================================
C++编程语言帮助中心 --
Yan Libin
2003-11-12, 15:32
>
> 是的,因为大多数反对者讨厌增加关键字,所以最初设计的时候,能少用就尽量少
用。
>
所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
> :
> :c++语法方面真是不够严谨。
>
> 那是因为C的语法不够严谨,语法的优美和严谨从来就不是C++的设计目标。
是呀,这不是技术上的问题,而是风格、传统或者说实用上的问题。
可能是,当初设计c语言的时候,内存、外存(穿孔纸带?)都还很有限,源代码也是
要尽量缩小空间的。这就形成了c语言非常简洁的关键字、运算符的风格,一直带到
c++。
当然,c,c++的巨大成功,一定程度上说明了,语言风格的简约甚至不够严谨,总体上
不会影响一个语言的成功运用和推广。
但是呢,就我个人来说,还是更欣赏pascal那种非常优美严谨的程序风格。
>
> 如果实在很关心诸如此类的语言设计的问题,参考读物是<>,
> 这是唯一的一本介绍程序设计语言的设计思想的书籍。
这本书有什么电子版下载的吗?请指点一下。
分身乏术的死猫
2003-11-12, 16:06
[12 Nov 2003 15:32:24 +0800]"Yan Libin"
的字符终端显示内容如下:
:>
:>
:所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
那我倒要请教一下,不用关键字怎么区分虚函数和非虚函数?
Object Pascal没有virtual,但是它有override;
Java没有virtual,但是它不做区分,所有的函数都是可以改写的,相当于强制为虚函数。
:
:但是呢,就我个人来说,还是更欣赏pascal那种非常优美严谨的程序风格。
你个人可以欣赏任何东西,不过为此抱怨没有任何价值。
:
:
:这本书有什么电子版下载的吗?请指点一下。
除了垃圾小说,我不看电子版。
这个是介绍,
~bs/dne.html
这本书中译本和英文影印版都有,价钱也不算太贵。
估计2-3个月的online game钱省下来就够了。
:
:
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
==============================================
C++编程语言帮助中心 --
zhangjun
2003-11-12, 16:18
"Yan Libin" 写入消息新闻:3fb1e208_3@News.Newsfan.Net...
> >
> > 是的,因为大多数反对者讨厌增加关键字,所以最初设计的时候,能少用就尽量少
> 用。
> >
> 所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
>
为什么我听这个过觉得象是小孩子撒娇一样,无理取闹的感觉。
现在C++里其实是很清楚的完成它设计中的目的,在我看来只要没有歧义就是可以接受
的语法(不能太复杂)。
wang tianxing
2003-11-12, 17:10
On 12 Nov 2003 16:06:24 +0800, 分身乏术的死猫 wrote:
: [12 Nov 2003 15:32:24 +0800]"Yan Libin"
: 的字符终端显示内容如下:
: :>
: :所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
:
: 那我倒要请教一下,不用关键字怎么区分虚函数和非虚函数?
方法多了,比如:
struct Foo {
void bar() = 1;
};
类似的招数以前 Borland 就用过,用于处理 Windows 消息,
可以避免写 message map,类似于这样:
void WmClose() = WM_CLOSE;
我以前搞过一个语言,其中所有的 built-in 的东西都不用字。
所有标识符都是留给用户的。在没有 syntax-hilighting 的年
代,我感觉没有保留字还真是一件好事。
Regards,
tx
分身乏术的死猫
2003-11-12, 17:31
[12 Nov 2003 17:10:29 +0800]wang tianxing
的字符终端显示内容如下:
:On 12 Nov 2003 16:06:24 +0800, 分身乏术的死猫 wrote:
:
:: [12 Nov 2003 15:32:24 +0800]"Yan Libin"
:: 的字符终端显示内容如下:
:: :>
:: :所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
::
:: 那我倒要请教一下,不用关键字怎么区分虚函数和非虚函数?
呵,我漏看了他说"更精简"。
:
:方法多了,比如:
:
: struct Foo {
: void bar() = 1;
: };
:
:
:
:Regards,
:tx
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
==============================================
C++编程语言帮助中心 --
Yan Libin
2003-11-12, 19:56
"分身乏术的死猫" 写入邮件
news:mmp3rvsppbko0qibccau3h1h5mjt2u64kn@4ax.com...
> [12 Nov 2003 15:32:24 +0800]"Yan Libin"
> 的字符终端显示内容如下:
> :>
> :>
> :所以,我的意思,干脆连virtual这个关键字也省略算了,不是更精简?
>
> 那我倒要请教一下,不用关键字怎么区分虚函数和非虚函数?
如Wang所述,要避免新增一个关键字,可以使用的方法多了。
比如,既然=0就可以指抽象函数,那么抽象函数也可以这样来定义呀。比如
void foo()=1;
你看,c和c++把键盘上的几乎所有符号都用光了,还不够,只能用符号的组合,比如
::, ->,&&, ++之类,为什么?不就是为了少用关键字,并且写出尽量“精简”的源程
序吗?
所以,假设当初c++用这样的符号来定义虚函数
void $foo();
不是更符合c++这种尽量使用符合而避免关键字的风格吗?
Wang老大还介绍他做的只用符号不用字的语言,呵呵,这算这种风格的极至了吧。
当然,这基本上就是程序风格的问题,与功能和性能无关。对于编译器来说, !和
not,$和virtual,%和mod,并没有本质上的不同。
> Object Pascal没有virtual,但是它有override;
Object Pascal有virtual,也有abstract,override,还有overload呢。在语法和书写
位置上,这些关键字是一致的,比如可以这样定义纯虚函数
function foo:integer;virtual;abstract;
> Java没有virtual,但是它不做区分,所有的函数都是可以改写的,相当于强制为虚
函数。
>
> :
> :但是呢,就我个人来说,还是更欣赏pascal那种非常优美严谨的程序风格。
>
> 你个人可以欣赏任何东西,不过为此抱怨没有任何价值。
我可没什么抱怨。c++我也经常用。我只是谈谈我的看法,我是觉得c++在一些语法、关
键字的设计上的风格不统一。
>
> :
> :
> :这本书有什么电子版下载的吗?请指点一下。
>
> 除了垃圾小说,我不看电子版。
这个,呵呵。你看,在这里,你也鲜明地表明了你的一种态度。对于你认为的好书,你
觉得应该是买实在的、纸张印刷的,不愿看电子版。
我倒觉得看电子版很习惯,当然,同时我也完全尊重你的观点。习惯看传统书的人毕竟
是多数。
所以呢,我认为,对于c++这样优秀的语言,在风格上是否能再统一点?
当然,你(和很多人)可能认为,c++就是这么的了,它这么设计都是有深刻道理的,
追求所谓的统一、完美完全不是c++应该关注的。
各人看法不同而已。
> 这个是介绍,
> ~bs/dne.html
> 这本书中译本和英文影印版都有,价钱也不算太贵。
> 估计2-3个月的online game钱省下来就够了。
>
分身乏术的死猫
2003-11-13, 14:08
[12 Nov 2003 19:56:30 +0800]"Yan Libin"
的字符终端显示内容如下:
:
:我可没什么抱怨。c++我也经常用。我只是谈谈我的看法,我是觉得c++在一些语法、关
:键字的设计上的风格不统一。
:
:所以呢,我认为,对于c++这样优秀的语言,在风格上是否能再统一点?
:当然,你(和很多人)可能认为,c++就是这么的了,它这么设计都是有深刻道理的,
:追求所谓的统一、完美完全不是c++应该关注的。
:各人看法不同而已。
不是我的个人看法,这是C++的发明者的意见,所以是不可辩驳的。
所以一点讨论的必要都没有,他就这么存在了,而且不太可能改变。
:
:> 这个是介绍,
:> ~bs/dne.html
:> 这本书中译本和英文影印版都有,价钱也不算太贵。
:> 估计2-3个月的online game钱省下来就够了。
:>
:
+----------------+
| 万 兽 皆 下 品 |
| 唯 有 猫 最 高 |
+----------------+
欲要了解死猫的执行结果,
请在命令行输入:
~shorn/
==============================================
C++编程语言帮助中心 --