2012-03-25 4 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» (базовая y()/полученная y())? и как мы можем контролировать, какой из них вызывать!

примечание: возьмите концепцию, я знаю, что эти три языка не совпадают.

+1

Пожалуйста, выберите один язык ; синтаксис и семантика различны для каждого. –

+1

@ OliCharlesworth: Я не согласен, вопрос ясен - и совершенно очевидно, как перевести вышеупомянутое на каждый из трех языков. –

+0

Г-н @ OliCharlesworth просто возьмите концепцию, я знаю, что три языка не совпадают, но кто может писать (C++/JAVA/C#) может читать и понимать код – Hilmi

ответ

2

(предполагая, что вы имели в виду, чтобы объявить все, как общественности, и использовать соответствующий синтаксис для каждого языка)

В 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().

Ваш вопрос очень вводит в заблуждение, кстати, поскольку «доступ» - это нечто совершенно иное (относится к и private и т. Д.). В этом случае код не будет компилироваться на любом языке, потому что B::a() не является public.

+0

Спасибо моему другу за ваш ответ, но то, что я написал, концепция и любой, кто может писать (C++/JAVA/C#), могут читать и понимать код. – Hilmi

2

Этот пример кода будет очень зависеть от языка, который вы используете здесь. В вашем вопросе упоминаются C#/C++ и Java здесь, и они будут отличаться для вышеуказанного базового шаблона.

C# и C++ довольно похожи здесь, поскольку функции по умолчанию не являются виртуальными. Следовательно, вызов x() в x() будет ссылаться на A::x. В Java, хотя методы являются виртуальными по умолчанию, поэтому он будет ссылаться либо на A::y, либо на B::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(); 
Смежные вопросы