наследование интерфейса abc и повторное предоставление методов в базовом классе - PullRequest
1 голос
/ 16 марта 2011

Мне любопытно, есть ли аккуратный способ предоставления методов в базовом классе производного интерфейса.

Итак, в коде: -

class cbase {
public:
  void MyMethodA() { }
};

class cderived : public cbase {
public:
  void MyMethodB() { }
}

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public ibase {
public:
  virtual void MyMethodB() = 0;
};

Теперь, если я заставлю cbase наследовать ibase, а cderived реализовать iderived, компилятор будет жаловаться, что когда я создаю экземпляр cderived, MyMethodA () является абстрактным, а нереализовано.

MyMethodA () реализовано в базовом классе и через ibase.Это единственный способ исправить это, чтобы переопределить методы ibase в классе cderived?Если это так, чёрт!

Итак, как показано ниже: -

class cbase : public ibase {
public:
  void MyMethodA() { }
};

class cderived : public cbase, public iderived {
public:
  void MyMethodA() { cbase::MyMethodA(); }
  void MyMethodB() { }
};

cderived inst;
iderived *der = &inst;  
der->MyMethodA();
der->MyMethodB();
ibase *bas = der;
bas->MyMethodA();

Надеюсь, этого достаточно, чтобы передать вопрос.:) Это может звучать немного странно, поскольку мы пытаемся реорганизовать старый код.

Я уверен, что есть много интересных комментариев;)

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Если я правильно понимаю, вы хотите сделать ibase виртуальным базовым классом iderived и cbase.

Это был только один экземпляр каждого из ваших классов интерфейса в иерархии классов, и когда вы объединяете cbase и iderived вместе на уровне cderived не виртуальное переопределение MyMethodA в cbase используется, потому что это доминирующее переопределение.

Смотрите здесь: Скрытые возможности C ++?

1019 * Е.Г. *

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
  virtual void MyMethodB() = 0;
};

class cbase : public virtual ibase {
public:
  void MyMethodA() { }
};

class cderived : public cbase, public virtual iderived {
public:
  void MyMethodB() { }
};

int main()
{
    cderived inst;
    iderived *der = &inst;  
    der->MyMethodA();
    der->MyMethodB();
    ibase *bas = der;
    bas->MyMethodA();
}
0 голосов
/ 16 марта 2011

Взгляните на множественное наследование .

Ответ на этот вопрос часто задаваемый вопрос:

class cderived : public virtual cbase {
public:
  void MyMethodB() { }
}

class ibase { 
public:
  virtual void MyMethodA() = 0;
};
class iderived : public virtual ibase {
public:
  virtual void MyMethodB() = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...