Могут ли два класса, наследующие один и тот же базовый класс, использовать функции друг друга? - PullRequest
0 голосов
/ 05 марта 2020

Я застрял в этой проблеме на основе наследования в C ++, и я не уверен, что мой подход даже правильный.

class A
{
private:
   string s;
public: 
   A(string s);
   virtual ~A;
   virtual void set(string s);
   virtual string get();
 };

class B : public virtual A
{
public:
   void set(string s);
   string get();
}

class C : public virtual A
{
public:
   void set(string s);
}

class D : public B, public C
{
public:
   void set(string s);
}

При вызове метода set из D мой код должен вызывать set метод C, но затем каким-то образом вызвать метод get метода B, находясь внутри метода set C. Я не понимаю, как это на самом деле возможно, так как B и C совершенно не связаны, за исключением того, что они оба наследуют один и тот же базовый класс. Я уверен, что проблема заключается в том, как я сделал эти заголовки, но каждое решение, которое я пробовал, приводило только к ошибкам компиляции.

Метод set D просто

D::set(string s){
   C::set(s);
   D::set(s);
}

1 Ответ

1 голос
/ 05 марта 2020

Во-первых, как указано в комментарии, все эти функции-члены являются закрытыми, поэтому ни одна из них не может вызывать другие. Предполагая, что это опечатка, и все они на самом деле помечены как publi c (или каждый класс является другом всех других, что определенно не очень хорошая идея), это можно сделать довольно простым способом.

В D::set() вы хотите позвонить C::set(). Это легко. Просто сделайте это:

void D::set(string s) {
    C::set(s);
}

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

void C::set(string s) {
    std::string res = get();
}

Это работает, потому что этот конкретный объект C фактически является частью объекта D, а каждый объект D имеет подобъект B, который переопределяет A::get(). В простом старом C объекте этот вызов get() вызовет A::get().

Просто чтобы прояснить: это очень запутанная иерархия классов, поэтому не смущайтесь из-за потери. С другой стороны, потеря может означать, что это слишком сложно, и здесь есть проблема с дизайном.

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