Могут ли несколько базовых классов иметь один и тот же виртуальный метод? - PullRequest
1 голос
/ 01 апреля 2019
  1. класс A имеет чисто виртуальный метод read()
  2. В классе B реализован виртуальный метод read()
  3. У меня есть класс C, который наследует A и B
  4. Может ли это произойти?

Я пытаюсь добиться того, чтобы два базовых класса A и B дополняли друг друга.

Таким образом, метод C read() фактически вызовет класс B read()

class A {
    virtual int get_data() = 0;

    void print() {
        log(get_data());
    }
}

class B {
    virtual int get_data() {
        return 4;
    }
}

class C : public A, public B {

}
C my_class;
my_class.print(); // should log 4;

Я не на своем компьютере, и у меня не будет возможности в ближайшие пару недель, поэтому я не могу проверить это ... но я разрабатываю архитектуру и мне нужно было знать, возможно ли это, а если нет ... как это можно сделать!

1 Ответ

2 голосов
/ 01 апреля 2019

Могут ли несколько базовых классов иметь один и тот же виртуальный метод?

  1. Может ли это случиться?

Да.

Таким образом, метод read () на самом деле вызвал бы чтение класса B ()

Это не происходит автоматически. Функция-член base не переопределяет функцию несвязанной базы.

Вы можете добавить переопределение к C:

class C : public A, public B {
    int get_data() override;
}

Это переопределяет и A::get_data и B::get_data. Чтобы "на самом деле вызвать read класса B ()" , вы действительно можете сделать такой вызов:

int C::get_data() {
    return B::get_data();
}

Или ... это было бы возможно, если бы вы не объявили B::get_data личным.


Переопределение функции в другой базе без явного делегирования в производном возможно , если вы немного измените свою иерархию. В частности, вам нужна общая база и виртуальное наследование:

struct Base {
    virtual int get_data() = 0;
};

struct A : virtual Base {
    void print() {
        std::cout << get_data();
    }
};

struct B : virtual Base {
    int get_data() override {
        return 4;
    }
};

struct C : A, B {};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...