如何将子方法调用到父方法

How to call the child method into parent

本文关键字:方法 调用 子方法      更新时间:2023-10-16

我有这个代码:

class Parent {
    public: 
    Parent() {
        init();
    }
    virtual void function() {
        std::cout<<"Parent function"<<std::endl;
    }
    private:
    virtual void init() {
        function();
    }
};
class Child : public Parent {
    public:
    virtual void function() {
        std::cout<<"child function"<<std::endl;
    }
};

我想在创建 Child 实例时从 Parent 的 init 函数调用 Child 函数。在这种情况下,输出是"子函数"而不是"父函数"。

这是不可能的。

直接从构造函数调用的函数以非虚拟方式调用,当这些函数调用虚函数时,它们被虚拟调用,但虚拟调度将为父类选择函数。不能从父类构造函数调用派生类的函数。

从构造函数/析构函数调用的方法函数不会虚拟调用。

您可以创建工厂方法以允许虚拟调用init

class Parent {
protected: 
    Parent() {}
public:
    virtual void function() {
        std::cout<<"Parent function"<<std::endl;
    }
    template <typename T, typename ... Ts>
    T MakeChild(Ts&&... args)
    {
        static_assert(std::is_base_of<Parent, T>::value, "!");
        T child(std::forward<Ts>(args)...);
        child.init();
        return child;
    }
private:
    virtual void init() {
        function();
    }
};