// 程序员面试100题之32不能被继承的类.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class FinalClass1
{
public:
static FinalClass1* GetInstance()// why static because can not return local variable, when compiling the error can not be detected
{
cout<<"in get instance"<<endl;
return new FinalClass1;
}
static void DeleteInstance( FinalClass1* pInstance)
{
cout<<"in delete instance"<<endl;
delete pInstance;
pInstance = NULL;
}
void serStr(char* strpara)
{
str = strpara;
}
char* getStr()
{
return str;
}
private:
FinalClass1() {}
~FinalClass1() {}
char* str;
};
template <typename T> class MakeFinal
{
friend T;
private:
MakeFinal() {cout<<"in base constructor "<<endl;}
~MakeFinal() {cout<<"in base destructor "<<endl;}
};
class FinalClass2 : virtual public MakeFinal<FinalClass2>//FinalClass2 is the friend of MakeFinal so it can access to the private constructor. virtual is necessary because it guarantee
//由于类FinalClass2是从类MakeFinal<FinalClass2>虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass2而直接调用MakeFinal<FinalClass2>的构造函数。非常遗憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能调用其私有的构造函数。
{
public:
FinalClass2() {cout<<"in derived constructor "<<endl;}
~FinalClass2() {cout<<"in derived constructor "<<endl;}
};
class Try : public FinalClass2
{
public:
Try() {cout<<"in try constructor "<<endl;}
~Try() {cout<<"in try constructor "<<endl;}
};
/**/
/*
class DerivedClass1 :public FinalClass1{
private:
int num;
public:
DerivedClass1(){
}
~DerivedClass1(){}
};
*/
int _tmain(int argc, _TCHAR* argv[])
{
FinalClass2 fc2;
Try t3;
FinalClass1 *fc1=FinalClass1::GetInstance();// thus, object does not call the constructor because directly called the static GetInstance of Class which does not belong to
//the object. if GetInstance is not static, compiling error for only static member can be called like this FinalClass1::GetInstance
fc1->serStr("where is my ?");
char* s = fc1->getStr();
//char* sa="abc";
cout<<s<<endl;//cout 居然不能输出string 对象
FinalClass1::DeleteInstance(fc1);
//DerivedClass1 dc1;
system("pause");
return 0;
}