Если вы объявите virtual A::showMsg
, его можно переопределить в любом производном классе.В этом случае не имеет значения, является ли B::showMsg
также виртуальным или нет.
class A;
virtual showMsg();
..
class B extends A;
showMsg();
class C extends B;
showMsg();
a = c;
a.showMsg() --> calls C::showMsg();
a = b;
a.showMsg() --> calls B::showMsg();
Однако, если only B::showMsg
равно virtual , A::showMsg
не будет переопределено, и любая ссылка на него через базовый класс будет вызыватьэта функция с A
.Однако он может быть повторно реализован в любом классе, производном от B
.Однако использование B
в качестве базового класса вызовет новую реализацию функции.
class A;
showMsg();
..
class B extends A;
virtual showMsg();
class C extends B;
showMsg();
a = c; (or a = b;)
a.showMsg() --> calls A::showMsg();
b = c;
b.showMsg() --> calls C:showMsg();
вам не хватает еще одного интересного случая, который вы хотите изучить:
a = c;
a.showMsg(13);