I'm trying to remove a virtual method called in a destructor. In order to fix the code I'm trying to replace the virtual method using a std::function passed via constructor. Here a proof-of-concept where the stop method was virtual:
#include <functional>
#include <iostream>
class Base {
public:
    Base(const std::function<void(void)> &ff) :
            cc(ff) {
    }
    Base(std::function<void(void)> &&ff) :
            cc(std::move(ff)) {
    }
    virtual ~Base() {
        exitBase();
    }
    void exitBase() {
        cc();
    }
   
private:
    std::function<void(void)> cc;
};
class Child: public Base {
public:
    Child() :
            Base(std::bind(&Child::stop, this)) {
    }
    void stop() {
        std::cout << "bbb" << std::endl;
    }
protected:
    Child(const std::function<void(void)> &ff) :
            Base(ff) {
    }
    Child(std::function<void(void)> &&ff) :
            Base(std::move(ff)) {
    }
};
class Child2: public Child {
public:
    Child2() :
            Child([&]() {
                stop();
                Child::stop();
            }) {
    }
    using Child::stop;
    void stop() {
        std::cout << "ccc" << std::endl;
    }
private:
};
int main() {
    Child2 c;
    return 0;
}
I have two questions:
- Is there any lifetime violation? I think even if the lambda is capturing by reference and the parent destructor is calling a piece of code in the child, the object should be alive until parent destructor finish, is it right?
 - If you see 
Child2the lambda calls explicitly the stop inChildin addition to the stop defined inChild2. Is there any way to combine the calls at parent level instead of letting the child the responsibility to call the parent stop method? 
Aucun commentaire:
Enregistrer un commentaire