GotW 建议没有 public 虚函数,但是接口 ala Java 呢?
GotW advices no public virtual functions, but what about interfaces ala Java?
根据 Herb Sutter 的说法,http://www.gotw.ca/publications/mill18.htm 建议您不要使用任何 public 虚函数,而是从非虚函数 public 调用私有虚函数。我明白了它的要点,如果你想在基础 class 中完成某些事情,如果将它放在派生的 class 覆盖的虚函数中,则无法完成。但是纯接口呢,真的有那么糟糕吗?具体来说,我说的是图书馆公开的 classes。采取观察者模式:
class Observer {
public:
virtual ~Observer() = default;
virtual void notify() = 0;
};
对
class Observer {
public:
virtual ~Observer() = default;
void notify() { doNotify() };
protected:
virtual void doNotify() = 0;
};
后者真的是我们应该使用的吗?我只是看不到收益。还是来自 Herb Sutter 的特定 post 只是过时了?
重点是 Java 中需要 "Pure Interfaces" 因为你只能从 Java 中不是纯接口的 class 继承(这确实有防止钻石继承的优势,因此避免了任何问题)。在 C++ 中,我们可以继承多个基础 classes,因此接口不需要是纯的。
在 Observer 的特殊情况下,基础 class 只是提供指向单个成员的成员函数指针的廉价方式,建议可能不适用。 (在现代 C++ 中,人们可能根本不会用基数 class 来实现 Observer,而是用 std::function 实现,它可以是 lambda、绑定函数或其他任何东西。)
根据 Herb Sutter 的说法,http://www.gotw.ca/publications/mill18.htm 建议您不要使用任何 public 虚函数,而是从非虚函数 public 调用私有虚函数。我明白了它的要点,如果你想在基础 class 中完成某些事情,如果将它放在派生的 class 覆盖的虚函数中,则无法完成。但是纯接口呢,真的有那么糟糕吗?具体来说,我说的是图书馆公开的 classes。采取观察者模式:
class Observer {
public:
virtual ~Observer() = default;
virtual void notify() = 0;
};
对
class Observer {
public:
virtual ~Observer() = default;
void notify() { doNotify() };
protected:
virtual void doNotify() = 0;
};
后者真的是我们应该使用的吗?我只是看不到收益。还是来自 Herb Sutter 的特定 post 只是过时了?
重点是 Java 中需要 "Pure Interfaces" 因为你只能从 Java 中不是纯接口的 class 继承(这确实有防止钻石继承的优势,因此避免了任何问题)。在 C++ 中,我们可以继承多个基础 classes,因此接口不需要是纯的。
在 Observer 的特殊情况下,基础 class 只是提供指向单个成员的成员函数指针的廉价方式,建议可能不适用。 (在现代 C++ 中,人们可能根本不会用基数 class 来实现 Observer,而是用 std::function 实现,它可以是 lambda、绑定函数或其他任何东西。)