LINUX.ORG.RU

C++ потомка наследника как аргумент функции

 ,


0

2

Я пишу на С, но надо реализовать кое-что на С++ Нужна помощь сообщества.

Есть родительский класс с одним методом

class root {
   void do_work();
};

От него наследуется 100500 потомков, каждый из потомков реализует свою собственную do_work()

Нужно написать функцию которая может принимать любой из потомков родительского класса и вызывает в нём do_work()

Я написал по минимуму. Вызывается метод класса root.

#include <iostream>

using namespace std;


class root
{
    public:
        root(void);
        ~root(void);
        void do_job();
};

class second: public root
{
    public:
        second();
        ~second();
        void do_job();
};

root::root(void) {};
root::~root(void) {};
void root::do_job(void) { cout << "ROOT do job\n"; }

second::~second(void) {};
second::second(void) {}; 
void second::do_job(void) { cout << "Fuck yeah!\n"; }

void work(root rt) { rt.do_job(); }

int main(int argc, char **argv)
{
    root rr = root();
    second sec = second();

    work(sec);
    
    return 0;
}

Это вообще реально? Как реализовывать подобное?

Если на этапе компиляции может быть известно, что передается в фнукцию, можно и

template <class Root> void work(Root rt) { rt.do_job(); }

CatsCantFly ()

Я пишу на С,

Тогда стандартным сишным способом:

typedef struct {
   void (*do_work)();
} root;
Begemoth ★★★★★ ()
    root rr = root();
    second sec = second();
    root rr;
    second sec;
anonymous ()
Ответ на: комментарий от trex6

АХТУНГ! ВСЕ СООБЩЕНИЯ, КРОМЕ ПЕРВОГО — ТРОЛЛИНГ!

vzzo ★★★ ()

Как человеку, не въехавшему во всю эту широту толщин, может объясните, почему нельзя функцию do_job() сделать виртуальной и вызывать метод по указателю на объект?

pathfinder ★★★★ ()
Ответ на: комментарий от greek_31

В первом сообщении.

Ну ок. Юмор в чём? Пускай ТС худеет?

pathfinder ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.