Создайте новую функцию, которая не унаследована от базового класса - PullRequest
2 голосов
/ 17 июня 2020

Могу ли я каким-то образом создать новый метод подкласса в C ++ с тем же именем, что и виртуальный метод в базовом классе, но с остановкой наследования?

Позвольте мне объяснить это более подробно, рассмотрим этот код:

#define L(m) std::cout << m << std::endl;

class A { 
public:
  virtual void func() { L("A::func"); };
  virtual void func2() { L("A::func2"); };
};     

class B: public A {
public:
  void func() { L("B::func"); }; //implements A::func
  void func2(){ L("B::func2"); }; //implements A::func2
}; 

class C: public A {
public:
  void func2() { L("C::func2"); }; //implements A::func2 
  void func() { L("C::func"); }; //meant to declare a new function but accidentally overrides A::func
};

Я не хочу объявлять func окончательным в A (я знаю, что это остановит наследование, но мне это нужно для класса B).

Также я хочу позвонить в C::func2 с помощью A:

C c;
A* a = &c;
a->func2(); //must use C::func2 (standard inheritance)
a->func(); //must use A::func !!! (possible?)
c.func2(); //must use C::func2
c.func(); //must use C::func

Очевидно, я могу переименовать C в func на что-нибудь другое, но в любом случае, возможно ли это каким-то образом без полного нарушения норм C ++?

1 Ответ

0 голосов
/ 17 июня 2020

Попробуйте следующее:

class C: public A {
public:
  void func2() { L("C::func2"); };
  void func(int i = 0) { L("C::func"); };
};

C::func скрывает A::func с другой подписью. Я получил такой результат:

C::func2
A::func
C::func2
C::func

Вместо этого с вашим кодом:

C::func2
C::func
C::func2
C::func
...