Этот пример кода будет очень зависеть от языка, который вы используете здесь. В вашем вопросе упоминаются 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();
Пожалуйста, выберите один язык ; синтаксис и семантика различны для каждого. –
@ OliCharlesworth: Я не согласен, вопрос ясен - и совершенно очевидно, как перевести вышеупомянутое на каждый из трех языков. –
Г-н @ OliCharlesworth просто возьмите концепцию, я знаю, что три языка не совпадают, но кто может писать (C++/JAVA/C#) может читать и понимать код – Hilmi