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
这四种情况都是非面向对象的继承。
网友评论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