很早以前在某个笔试题集里看到了这个题目,MS是Adobe公司出的。当时第一反应要用到什么私用化构造函数,友元之类的技术,但后来实现的时候却发现更多的问题,现在已经一一搞明白了。今天记在这,总结一下。
主要的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <iostream> using namespace std; template<typename T> struct Type2Type { typedef T Value; }; template<typename T> class NoDerivedBase { friend class Type2Type<T>::Value; private: NoDerivedBase() {} ~NoDerivedBase() {} }; class A : virtual public NoDerivedBase<A> { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } }; class B : public A { public: B() { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } }; int main() { A a; B b; } |
几个要点:
- 在NoDeriveBase这个类里是不能直接写,friend class T的,编译器(gcc)会报错。所以要用Type2Type的技术,Loki库里常用的技术。
- 为什么A要虚继承自NoDeriveBase?原因是A虚继承后,B再继承A时,B要直接访问虚基类的构造函数,而不是直接通过A的构造再访问NoDeriveBase的构造。所以,如果不虚继承的话,B是可以继承A的。
- 这段代码会编译出错。B是不可以继承A的。
终于都明白了! 🙂