程序员面试100题之32不能被继承的类

本文深入探讨了C++中静态成员函数、模板类、虚继承及私有构造函数的概念,通过实例展示了如何实现不能被继承的类,并解释了类间继承时的构造函数调用顺序。
// 程序员面试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;
}
我从来都不能自己想出来,惭愧尴尬
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值