То, что будет делать этот пример кода, очень зависит от языка, который вы здесь используете.Ваш вопрос упоминает 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();