Вызов соответствующей родительской функции класса из производной функции класса в множественном наследовании - PullRequest
0 голосов
/ 01 июня 2018

Предположим, у меня есть следующие классы:

class Base {
  virtual void func() { cout << "func base" << endl; }
};

class A : virtual public Base {
  public:
  virtual void func() { cout << "func A" << endl; }
};

class B : virtual public Base {
  public:
  virtual void func() { cout << "func B" << endl; }
};

class C : public A, public B {
  C(bool is_a);
  public:
  virtual void func() { // Call appropriate parent's func here }
};

Мое требование заключается в том, чтобы соответствующая функция родительского класса func() вызывалась при вызове C func().Вот что я имею в виду под соответствующими:

Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally

Как этого добиться?Это вообще возможно?

[править]

Это может быть скорее вопросом дизайна.Известно, что у класса C будет только один истинный родитель (либо A, либо B).И в зависимости от того, кто является родителем, я хочу, чтобы эта функция вызывалась.Любые альтернативные предложения дизайна приветствуются.

Я извлекаю C из A и B, потому что есть некоторые общие функции, которые совместно используются в A и B и которые не могут быть частью базового класса.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Возможно, это вопрос дизайна.Известно, что у класса C будет только один истинный родитель (либо A, либо B).И в зависимости от того, кто является родителем, я хочу, чтобы эта функция вызывалась.Любые альтернативные варианты дизайна приветствуются.

class Base { };
class A : public Base { };
class B : public Base { };
class C
{
    // common interface for all types of C
};

class C_A : public A, public C { };
class C_B : public B, public C { };

Теперь вы можете использовать C_A, где C должен вести себя как A и C_B аналогично ...

В приведенном выше примере все виртуальные наследования удалены, они не нужны как есть.В зависимости от варианта использования может быть целесообразным позволить самому классу C наследоваться от Base.Если это так, пусть все A, B и C наследуются практически от Base.C_A и C_B, тем не менее, не нужно фактически наследовать от своих родителей (все равно будет только один экземпляр Base, унаследованный из-за виртуального наследования базовых классов).

0 голосов
/ 01 июня 2018

Вам нужно позвонить A::func() явно.

class C : public A, public B {
  public:
  virtual void func() { A::func(); }
};

Обновление (к вашему):

Чего вы действительно хотите достичь?Есть ли актуальная проблема, которую вы хотите решить?

Если вы знаете, что "класс C будет иметь только одного истинного родителя" , зачем вам в первую очередь использовать производные от A и B ?Даже если ответ Аконкагуа работает, это больше похоже на обход проблемы, которая не была должным образом сформулирована с вашей стороны.Если вы имеете дело с различными реализациями для своего класса, не хотите ли вы вместо этого использовать какой-нибудь шаблон (например, bridge или стратегии ) вместо этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...