【发布时间】:2015-10-31 09:48:39
【问题描述】:
我目前正在阅读有关 mixin 类的信息,我想我或多或少地理解了所有内容。我唯一不明白的是为什么我不再需要虚函数了。 (见here和here)
例如Greatwolf 在his answer 中写道,不需要虚函数。这是示例:(我只是复制了基本部分)
struct Number
{
typedef int value_type;
int n;
void set(int v) { n = v; }
int get() const { return n; }
};
template <typename BASE, typename T = typename BASE::value_type>
struct Undoable : public BASE
{
typedef T value_type;
T before;
void set(T v) { before = BASE::get(); BASE::set(v); }
void undo() { BASE::set(before); }
};
typedef Undoable<Number> UndoableNumber;
int main()
{
UndoableNumber mynum;
mynum.set(42); mynum.set(84);
cout << mynum.get() << '\n'; // 84
mynum.undo();
cout << mynum.get() << '\n'; // 42
}
但是如果我做这样的事情现在会发生什么:
void foo(Number *n)
{
n->set(84); //Which function is called here?
}
int main()
{
UndoableNumber mynum;
mynum.set(42);
foo(&mynum);
mynum.undo();
cout << mynum.get() << '\n'; // 42 ???
}
mynum 有什么价值,为什么?多态性在foo()?! 中是否有效?
【问题讨论】:
-
你在那个答案的cmets中有答案。
-
mixin 旨在为派生类添加功能。它不打算用作接口(需要虚拟功能)。
标签: c++ polymorphism mixins virtual-functions