Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987981
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-19 13:16:52

非多态的继承

由“什么情况下,基类可以不提供非虚析构函数?”而来,

1. 位继承。顾名思义,继承的是位,而不是接口
比如
struct Head
{
    int length;
    int flag;
};
struct MyFile : Head
{
    ……
};
[注]:位继承 和 包含 是有强烈语义差别的,虽然有可以互相变通的语法和语义。

2. 实现继承。顾名思义,继承的是实现,而不是接口
比如 protected继承 和 private继承。
[注]:继承实现应当比继承接口更安全也用得更广,看STL的实现可知,但很多人受XXXX荼毒太深滥用了面向对象。

3. 非多态全继承。顾名思义,继承实现也继承接口,但却是非多态的
比如我想在map的基础上增加一个功能变成字典
struct Dictionary : public map
{
    void foo() const;
};
[注]:map是一个不含任何虚函数的类。

以上三种情况下,从多态上讲(这个限定语是必须的)派生类都不是一个基类,因此你不可以使用dynamic_cast进行转化.

4. 在这一种情况下,设计者本来的意图也不是多态继承,但可惜从语法上说它是多态继承也能说得过去。(这种矛盾其实经常遇到,比如mutable的由来)
比如在第三段给的代码中,假设(只是假设,而不是事实)map是一个含有虚函数的类。这样一来从语法上可以把Dictionary看成一个map,不过既然设计者没有多态的意图,那么把它作多态来用的也只有傻子,当然它也就无须提供虚析构函数。

这四种情况都是非面向对象的继承。

阅读(3602) | 评论(20) | 转发(2) |
0

上一篇:互锁操作

下一篇:清除输入流的错误

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

网友评论2012-11-19 13:23:37

清风雨
你说的采访的我以前看过。

可能就是隐性觉得你对这个太过了。就是感觉好像全世界都是在不停的面向对象。
而我的公司不是你那样的,而是对面向对象的理解和使用很浅(虽然,你的公司,我也觉得也很浅,至少表面上看是这样的),所以,我觉得国内并不是面向对象泛滥,而是形而上学泛滥,学术主义泛滥。^_^
再者,大可不必拘泥于形式的名词!哪里又不是混合的呢,其实都是结合体。只是各自的偏重和分量罢了。
java并不是你想的那样,如果有空和有闲心,看看也无妨。至少在我看来,他的很多设计和思想是相当优秀的。至于对你,我就不是很清楚了,因为我并不了解你很多。你喜欢成语,也丢一个词:兼收并蓄!

这样说话听起来大家才都舒服嘛!对不?

网友评论2012-11-19 13:23:20

周星星
1。^_^ 其实,Bjarne在2002年的采访中的原话是:“虽然泛型思想在C++很重要,但C++不是一个泛型的语言,如同它不是一个面向对象的语言一样,C++是一个多典范语言”。
看到了吧,C++是一个多典范语言,如同《E》中所说,各种典范(基于过程、基于对象、面向对象、泛式编程、functional, generative,meta programming 等等)是相辅相成,而不是替代的关系。

2。Bjarne在多次采访中强调C++是一个发展的语言,你可以说"c with class"的设计目的和思想是面向对象,但C++不是,它是多典范的,这就是"c with class"和"C++"的本质区别。
你也可以说最初的C++中面向对象占的比例很大,但你不能说C++是面向对象的,如同现在的C++中泛型思想占的比例最大,但C++仍不是泛型编程的语言,她是多典范的。C++是一个发展的语言,会随时调整自己以适应新的环境,比如C++加入template

网友评论2012-11-19 13:22:59

清风雨
你认为C++最重要的思想是什么? 难道是标准库的范型思想?
这个说不通吧?要知道,std是后来才加入进去的,虽然影响很大。C++设计时的目的和思想,恐怕还是面向对象吧。并不会因为现在有人对这个认识觉得必需加以纠正,以免过头,而改变吧。而且,大家实际应用时的主要思想基本还是面向对象的思想。

网友评论2012-11-19 13:22:45

ilovevc
没错. 说singleton不贴切, 应该说"工厂", singleton可以看做是一个特殊的工厂, 只产生一个.  

不过仍然, private 析构函数不涉及到继承.  
否则派生类如何继承? 在基类中声明所有的派生类为friend? 不大可能.

网友评论2012-11-19 13:22:32

清风雨
你说的3很有道理。