c++ - 修复对象初始化以便调用覆盖方法

标签 c++ virtual-functions

我有什么(简化版):

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 protected 等)。

最佳答案

你不能。

在构建基础期间,派生的子对象尚不存在。

您可以尝试创建一个工厂函数,它控制创建 Property。然后一步实例化,第二步注册。根据需要使工厂函数成为 friend ,并让所有相关机器成为私有(private)

关于c++ - 修复对象初始化以便调用覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57853255/

相关文章:

c++ - 基类中的虚函数

java - 关于java虚方法的问题

c++ - Boost python包装了一个虚拟方法

c++ - 删除字符串中具有相同值的任何相邻字母的 “pair”

c++ - 不间断地构建 Boost.Thread

c++ - 就地随机选择算法

c++ - MSVC : Reading a specific 64 or 32 bit register (e. g。 R10) 64 位代码?

c++ - 将虚函数覆盖为非虚函数可以吗?

c++ - 为什么我不能从转换的字节(字符)数组中调用虚函数?

c++ - 是否可以在每个类中只传递一次变量而不是将其设为静态?