2012-03-25 92 views
-1

与C#,Java或C++ ...自定义访问继承功能

,我们有以下类

class A 
{ 
    void x(){y();} 
    void y(){} 
} 

class B :A 
{ 
    void y(){}; 
    void a(){x();} 
} 

//in main or somewhere 
B b=new B(); 
b.a(); 

当函数“一”之称,它会调用基“X”功能 的问题是函数“x”将调用哪个函数(base y()/ derived y())? 以及我们如何控制哪一个调用!

注意:采取这个概念,我知道三种语言是不一样的。

+1

请选择一种语言;每种语法和语义都是不同的。 – 2012-03-25 15:56:26

+1

@OliCharlesworth:我不同意,问题很清楚 - 如何将上述内容翻译成三种语言中的每一种都是非常明显的。 – 2012-03-25 16:07:32

+0

@OliCharlesworth先生刚刚采取了这个概念,我知道三种语言不一样,但谁可以写(C++/JAVA/C#)可以阅读和理解代码 – Hilmi 2012-03-26 06:55:57

回答

2

(假设你的意思是一切声明为public,并使用相应的语法为每种语言)

在Java和C#,它会调用B ::年。

在C++中它会调用A :: y。

在C++中,如果您声明A :: y为虚拟它将调用B :: y。执行静态分派(A :: y)比动态分派(B :: y)更高效,因此该选项在C++中保持打开状态以在它们之间进行选择(虚拟或非虚拟)。对于Java和C#语言设计者决定保持简单并且只允许动态分派,所以这两种语言没有办法做静态分派(A :: y)。

2

您的代码无效C++,但如果您说B * b = new B; b->a();,那么将调用A::y(),因为它不是virtual。在Java中,所有非静态成员函数都是隐式虚拟的,所以B::y()在那里被调用。

顺便说一下,您的问题很具误导性,因为“访问”是完全不同的(与publicprivate等有关)。对于这个问题,代码不会以任何语言编译,因为B::a()不是public

+0

感谢我的朋友给出你的答案,但我写的是概念和任何可以编写(C++/JAVA/C#)的人都可以阅读和理解代码。 – Hilmi 2012-03-26 06:50:52

2

此代码示例将执行的操作非常依赖于您在此处使用的语言。你的问题在这里提到C#/ C++和Java,它们会因上述基本模式而有所不同。

C#和C++在这里非常相似,因为默认情况下函数并不是虚拟的。因此x()x()的调用将参考A::x。在Java中,虽然默认方法是虚拟的,因此它将参考A::yB::y,具体取决于this的实际类型。

这里是所有3种语言的样本进行y()是虚拟调用

C++

class A { 
public: 
    void x(){ y(); } 
    virtual void y(){} 
}; 

class B : public A { 
public: 
    // virtual not needed here but nice 
    virtual void y() { }; 
    void a() { x(); } 
}; 


B* b = new B(); 
b->a(); 

C#

class A { 
    public void x(){ y(); } 
    public virtual void y(){} 
} 

class B : public A { 
    public overrides void y() { }; 
    public void a() { x(); } 
}; 


B b = new B(); 
b.a(); 

的Java

class A { 
    public void x(){ y(); } 
    public void y(){} 
} 

class B : inherits A { 
    public void y() { }; 
    public void a() { x(); } 
}; 

B b = new B(); 
b.a();