【发布时间】:2019-09-09 11:37:02
【问题描述】:
我有什么(简化版):
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