Как два наследующих класса могут вызывать методы друг друга? - PullRequest
0 голосов
/ 14 октября 2019

Если 2 класса наследуют 1 базовый класс, то как эти два дочерних класса могут вызывать функции друг друга? Как, например, один объект дочернего класса может вызывать функцию другого дочернего класса?

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Вот пример использования виртуальных функций-членов.

#include <iostream>

struct Base { // abstract base class
    virtual void func_1(Base&) = 0;
    virtual void func_2(Base&) = 0;
    virtual ~Base() = 0;
};

Base::~Base() {} // to not force children to have to implement the destructor

// child classes, overriding the necessary virtual functions in the base class
struct One : Base {
    void func_1(Base& o) override {
        std::cout << "One calling some Base descendant\n";
        o.func_2(*this); // here, one child is calling another
    }

    void func_2(Base& o) override {}
};

struct Two : Base {
    void func_1(Base& o) override {}

    void func_2(Base& o) override { 
        std::cout << "Two called\n";
    }
};

int main() {
    One o;
    Two t;
    o.func_1(t);
}

Вывод:

One calling some Base descendant
Two called
0 голосов
/ 14 октября 2019

Они не. Оба объекта будут расширять базовый члены класса, поэтому они будут иметь одинаковые члены и атрибуты, но не будут иметь никаких других дополнительных характеристик.

Довольно забавная аналогия: когда они говорят, что у детей есть глаза их матери, они не имеют в виду, что у них действительно есть ее глаза, у них просто есть генетически совершенные копии их, причем отдельные копии.

См. Это, если вы ссылаетесь на ссылки дочерних классов: Как использовать clone () в C ++ с множественным наследованием абстрактных классов?

...