| |||
| 基本上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 B ublic A{public: void show(){ cout<<"year"<<endl; } }; int main() { B* b=new B(); b->show(); } 不知道为什么 大家说说看撒 此帖于 2007-09-21 08:06 PM 被 c++primer 编辑. |
| |||
| 这个……C++设计得不好,慢慢看书吧…… 不过你那段例子不平等吧,java里面调用choose, C++倒在那里调用show() 代码:
代码:
注:好久没写C++了以上只是凭感觉不保证没错。 |
| |||
| Java的简单啊~ 除了final函数全都是virtual的,然后对C++这种松散的容易让人费解的规则进行了修正。 内存模型上,object的变量的分布和C++应该是差不多的,你那个例子里面因为子类里面某个函数是private的,所以对外(包括子类)来说这个函数不存在,自然也不会被覆盖,只有看得见它的人可以访问。如果改成了public就不同了,直接是virtual的了,然后子类就覆盖了这个函数。这个规则相比C++只要virtual就能覆盖来说要精致一些。然后C#的话我记得不能写private virtual 此帖于 2007-09-23 12:28 PM 被 cat 编辑. |
| |||
| 继承可以分为实际的继承效果和语义上的继承两个层面讨论。 语义上,继承表示特化,表示子类化,表示在父类这个概念的外延集合中特定的析取出一个子集。这样,继承在语义上显然就是继承了父类的全部,因为它就是一个父类嘛。 实际的继承效果上,子类继承了父类所有可见的名字(以及部分不可见的名字,这是继承这个强耦合关系所付出的代价)。包括内嵌类型【还有常见的typedef】,成员,静态成员等等。根据这些member的特性,他们分别可以被override、overload【hidden】或者保持不变。由于C++有一个friend机制,所以,类中的名字有一种是friend,这个名字不被继承。 在实际的实现中,C++以追求时间效率为主,子类完全继承了父类的member layout,作为自己的一个组成部分,同时希望能够做到dynamic_cast的代价最小,这就意味着:父类组成部分放在子类对象的最前面【注意:这不是绝对的,对于virtual继承,就不是这样】。另外,对于vptr和vtbl,也就是C++用来实现虚函数的机制,跟这儿的描述不同。对于static member,名字继承下来了,但是仍然保持一份。 |