-
thrift采用了NVI(Non-Virtual Interface)模式, 我写了一个demo如下:
#include <boost/shared_ptr.hpp> #include <iostream> class Parent { public: void read() { read_virt(); } virtual void read_virt() { } void write() { write_virt(); } virtual void write_virt() { } }; class DefaultSon : public Parent { public: virtual void read_virt() { std::cout << "DefaultSon read" << std::endl; } virtual void write_virt() { std::cout << "DefaultSon write" << std::endl; } }; template <class Me, class super_ = DefaultSon> class VirtualParent: public super_ { public: virtual void read_virt() { return static_cast<Me *>(this)->read(); } virtual void write_virt() { return static_cast<Me *>(this)->write(); } }; class GoodSon : public VirtualParent<GoodSon> { public: void read() { std::cout << "GoodSon read" << std::endl; } void write() { std::cout << "GoodSon write" << std::endl; } }; class BadSon : public VirtualParent<BadSon> { public: void read() { std::cout << "BadSon read" << std::endl; } void write() { std::cout << "BadSon read" << std::endl; } }; int main() { boost::shared_ptr<Parent> p(new GoodSon()); p->read(); p->write(); boost::shared_ptr<Parent> q(new BadSon()); q->read(); q->write(); }
在thrift里面,TTransport, TProcessor, TProtocol等都采用了这种继承方式