首页 > 解决方案 > 修复对象初始化,以便调用覆盖的方法

问题描述

我有什么(简化版):

template<typename T> class Watcher
{
 public:
    T* m_watched { nullptr };
    Watcher() = default;
    Watcher(T* watched) : m_watched(watched) { m_watched->addWatcher(this); };
    virtual void notifyChange(int = 0) /*= 0*/{std::cout << "Watcher::notifyChange()\n";};
};

template<typename T> class Watchable
{
 public:
    std::vector<Watcher<T>*> m_watchers;
    virtual void addWatcher(Watcher<T>* watcher)
    {
        m_watchers.push_back(watcher);
        watcher->notifyChange();
    }
};

class Config : public Watchable<Config>
{
};

class Property : public Watcher<Config>
{
 public:
    Property(Config* config) : Watcher<Config>(config) {};

    void notifyChange(int = 0) override { std::cout << "Property::notifyChange()\n"; }
};

因此,当我创建基类(Watcher)的Property notifyChange() 实例时,会调用它。

我理解为什么会发生这种情况,但我不知道如何解决这个问题,仍然有适当的现代 C++ 代码(例如,没有使 m_watched 受保护等等)。

标签: c++virtual-functions

解决方案


你不能。

在基础的构建过程中,派生的子对象还不存在。

您可以尝试创建一个工厂函数,该函数控制创建Propertys. 然后它可以一步实例化,并在第二步中注册。根据需要使工厂功能friend和所有相关的机器都不是private


推荐阅读