返回   cpper编程论坛 > C/CPP/TMP/GP
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2007-09-19
初级会员
 
注册日期: 2007-04-14
帖子: 22
c++primer 正向着好的方向发展
默认 关于继承的疑惑

继承到底继承了些什么东西
private修饰的东西继承么?
C和Java中关于继承的解释有区别么?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2007-09-20
初级会员
 
注册日期: 2004-11-29
帖子: 4
oxygen 正向着好的方向发展
默认 回复: 关于继承的疑惑

我认为在C++里首先是继承了内存布局。也就是说子类的内存布局和父类兼容(多继承时除外)。
其次是获得了protected的访问权。
再次就是遮蔽掉父类中的同名函数。
还有在虚表中修改被重载的虚函数的地址。

感觉就这些了。
请补充。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2007-09-21
初级会员
 
注册日期: 2007-04-14
帖子: 22
c++primer 正向着好的方向发展
默认 回复: 关于继承的疑惑

基本上C++中是楼上说的这样
但是在java中好像对于私有的并没有继承

public class C{
public static void main(String[] args){
B b=new B();
b.show();
}
}
class A{
private void show(){
System.out.println("hello");
}
public void choose(){
show();
}
}

class B extends A{
public void show(){
System.out.println("year");
}
}


这个会调用A中的show()
但是要是把A中show()的权限改成public的话就会调用B中的show()
但是在C++中模拟这样的情形却总是调用子类中的show()

#include<iostream>
using namespace std;

class A{
private: void show(){
cout<<"hello"<<endl;
}
public: void choose(){
show();
}
};

class Bublic A{
public: void show(){
cout<<"year"<<endl;
}
};

int main()
{
B* b=new B();
b->show();
}
不知道为什么
大家说说看撒

此帖于 2007-09-21 08:06 PM 被 c++primer 编辑.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2007-09-22
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,560
文章: 6
cat 正向着好的方向发展
默认 回复: 关于继承的疑惑

这个……C++设计得不好,慢慢看书吧……

不过你那段例子不平等吧,java里面调用choose, C++倒在那里调用show()
代码:
int main() { B* b = new B(); b->show(); // B::show() A* a = b; a->show(); // A::show() b->choose(); // A::show() a->choose(); // A::show() }
然后看下面的:
代码:
class A { private: virtual void show() { cout<<"hello"<<endl; } public: void choose() { show(); } }; class B: public A { public: void show() { cout<<"year"<<endl; } }; int main() { B* b = new B(); b->show(); // B::show() A* a = b; // a->show(); // B::show(), 但是编译错误,因为是private的 b->show(); // B::show() a->choose(); // B::show() b->choose(); // B::show() B bb; A aa = bb; bb.show(); // B::show() aa.show(); // A::show() }
反正假设你觉得你那段代码的行为很奇怪,那么奇怪的行为还有很多,而理解这些行为最好的方式是理解C++的类型系统和虚函数怎么工作的。懒得说,慢慢看书吧

注:好久没写C++了以上只是凭感觉不保证没错。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2007-09-22
初级会员
 
注册日期: 2007-04-14
帖子: 22
c++primer 正向着好的方向发展
默认 回复: 关于继承的疑惑

嘿嘿
楼上的感觉还真不错,全部是对的,只是aa.show()不能通过编译
上面我的确实不相等
应该是想楼上说的那样做成虚拟的。
这个解释根据孙卫琴的java参考书上说的是在java中对于父类私有的成员子类是不继承的
但是在C++中应该是继承的!
不知道想看java中的继承的内存模型应该看什么书呢?

此帖于 2007-09-22 03:10 PM 被 c++primer 编辑.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2007-09-22
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 回复: 关于继承的疑惑

C++里得的继承(无论public,protected,private)会一股脑继承父类所有的东西(共有,保护,私有成员函数和变量)。唯一的问题是访问级别可能会改变,但是访问不了不等于它们不存在。
至于你的问题,实际上这就是C++中的覆盖:子类函数会覆盖父类所有的同名函数,不论它们的访问级别如何。这里有个比较极端的例子,子类的同名private函数可以覆盖父类的public函数:
代码:
class A { public: void Print() {}; }; class B : public A { private: void Print() {}; }; int main() { B b; b.Print(); //编译出错,不能访问私有成员函数 }
实际上,C++中的所有名字解析规则对待继承的态度都是:父类继承了所有的子类函数和变量。因此访问级别是在名字解析完成之后才最后被考虑的,这时如果结果是访问级别不够,编译器就要报错了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2007-09-22
初级会员
 
注册日期: 2007-04-14
帖子: 22
c++primer 正向着好的方向发展
微笑 回复: 关于继承的疑惑

谢谢上面几位大哥的回答
学了不少东西
但是怎么都不愿意解释下java中的内存模型呢??
难道java太简单?
不屑一解释
嘿嘿
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2007-09-23
cat cat 当前离线
高级会员
 
注册日期: 2003-11-06
帖子: 1,560
文章: 6
cat 正向着好的方向发展
默认 回复: 关于继承的疑惑

Java的简单啊~ 除了final函数全都是virtual的,然后对C++这种松散的容易让人费解的规则进行了修正。

内存模型上,object的变量的分布和C++应该是差不多的,你那个例子里面因为子类里面某个函数是private的,所以对外(包括子类)来说这个函数不存在,自然也不会被覆盖,只有看得见它的人可以访问。如果改成了public就不同了,直接是virtual的了,然后子类就覆盖了这个函数。这个规则相比C++只要virtual就能覆盖来说要精致一些。然后C#的话我记得不能写private virtual

此帖于 2007-09-23 12:28 PM 被 cat 编辑.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #9 (permalink)  
旧 2007-09-24
普通会员
 
注册日期: 2003-08-25
帖子: 80
fixopen 正向着好的方向发展
默认 回复: 关于继承的疑惑

继承可以分为实际的继承效果和语义上的继承两个层面讨论。
语义上,继承表示特化,表示子类化,表示在父类这个概念的外延集合中特定的析取出一个子集。这样,继承在语义上显然就是继承了父类的全部,因为它就是一个父类嘛。
实际的继承效果上,子类继承了父类所有可见的名字(以及部分不可见的名字,这是继承这个强耦合关系所付出的代价)。包括内嵌类型【还有常见的typedef】,成员,静态成员等等。根据这些member的特性,他们分别可以被override、overload【hidden】或者保持不变。由于C++有一个friend机制,所以,类中的名字有一种是friend,这个名字不被继承。
在实际的实现中,C++以追求时间效率为主,子类完全继承了父类的member layout,作为自己的一个组成部分,同时希望能够做到dynamic_cast的代价最小,这就意味着:父类组成部分放在子类对象的最前面【注意:这不是绝对的,对于virtual继承,就不是这样】。另外,对于vptr和vtbl,也就是C++用来实现虚函数的机制,跟这儿的描述不同。对于static member,名字继承下来了,但是仍然保持一份。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #10 (permalink)  
旧 2007-09-25
初级会员
 
注册日期: 2007-04-14
帖子: 22
c++primer 正向着好的方向发展
默认 回复: 关于继承的疑惑

诚心的谢谢大家的回答!
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #11 (permalink)  
旧 2008-09-20
aychxm 的头像
入门
 
注册日期: 2008-09-20
住址: 北京
帖子: 3
aychxm 正向着好的方向发展
发送 MSN 消息给 aychxm
默认 回复: 关于继承的疑惑

很精辟,受教了
呵呵
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #12 (permalink)  
旧 2008-10-08
liuxinyu 的头像
高级会员
 
注册日期: 2006-02-09
帖子: 303
文章: 48
liuxinyu 正向着好的方向发展
默认 回复: 关于继承的疑惑

考虑oo的继承特性,拿C++和Java来入手不是特别理想,其实访问权限不是oo必须的。
例如smalltalk这样的情形根本没有public,protected和private的限制。其他诸如python, ruby就不一一详细说了。C++更多考虑效率和内存,所以自然会讨论到实现。对继承的实现,不同的设计思路有不同的考虑。Java很大程度上是对C++进行语法上的简化。语义和语用还是很近似的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #13 (permalink)  
旧 2 周前
初级会员
 
注册日期: 2008-11-15
帖子: 1
gauss 正向着好的方向发展
默认 回复: 关于继承的疑惑

我们编程的经常上网,网上赚赚钱也不错!!

八趣通宝——只要能上网,像挂QQ一样挂着就能轻松狂挣Q币或人民币
八趣通宝是国内最新的网挣,发展空间巨大,挂着就能赚钱,操作巨简单,强烈推荐!
注册地址:[url=http://www.8qu.net/register.asp?net=gauss]
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 07:08 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0