/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q1:
實現c++不能被繼承的一個類:
實現一個c++類,該類不能被繼承。
S1:
1: 由於繼承父類的子類會自動繼承父類的構造函數和析構函數,如果
把父類的構造函數和析構函數定義爲私有成員,那麼將會導致子類
試圖繼承該類失敗;
2:定義一種虛擬繼承,使用友元特性。
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
/* 方法1 */
class Base
{
static Base*newBase()
{
return (new Base);
}
static void deleteBase(Base*instance)
{
delete instance;
}
private:
Base(){}
~Base(){}
};
// class S1 : public Base
// {
// public:
// S1(){}
// ~S1(){}
// };
/* 方法2 */
template<typename T>
class Base2
{
// 聲明T類型爲該類型的友元成員
friend T;
private:
Base2(){}
~Base2(){}
};
class S2 : virtual public Base2<S2>
{
public:
S2(){}
~S2(){}
};
// class S3 : public S2
// {
// public:
// S3(){}
// ~S3(){}
// };
void test_1()
{
Base base1 = Base::newBase();
Base::deleteBase(&base1);
// // cannot work.
// S1 s1 = S1();
S2 s2 = S2();
// S3 s3 = S3();
}
void test()
{
test_1();
}
int main(int argc, char**argv)
{
test();
return 0;
}