剑指offer面试题:用C++实现一个不能被继承的类
因为子类继承父类,子类的构造函数和析构函数会调用父类的构造,
解决问题的方法就是,不允许子类的构造函数调用父类的构造与析构。
--------------------------------------------------------------------
将父类的构造函数和析构函数设置为private成员函数,私有成员只能被自身的类访问。
//sealed是C#中的一个关键字,主要是用来表示一个不能被继承的类 1. clasa SealedClass { public: static SealedClass* getInstance() { return new SealedClass(); } static void Delete(SealedClass* p) { delete p; } private: SealedClass() //将构造函数和析构函数设为私有 {} ~SealedClass() {} };
SealedClass类不能被访问,因为它的构造函数和析构函数定义为private成员,但是如果类SealedClass定义它的实例时会发生错误,怎样才能的到该类型的实例呢?我们可以通过公有的静态函数和创建和释放该类的实例,即上述的 static SealedClass* getInstance()和 static void Delete(SealedClass* p)函数。该方法的缺点:该类的实例只能在堆上创建与我们常见的类的构造与析构不同
2.虚函数
//有一个缺陷,在vs里支持友元,GCC下不支持模板参数作为友元 template <typename T> class MakeSealed { friend T; private: MakeSealed() {} ~MakeSealed() {} }; class SealedClass : virtual public MakeSealed { public: SealedClass() {} ~SealedClass() {} }; // int main() { SealedClass* a=Sealedclass::getInstance(); return 0; }
此方法的优点:
类的实例既可以在堆上创建,又可以在栈上创建;
更符合类的表示
类的实例既可以在堆上创建,又可以在栈上创建;
更符合类的表示
相关面试题:
1.实现一个只能在栈上生成对象的类。
2.实现一个只能在堆上生成对象的类。
1.实现一个只能在栈上生成对象的类。
2.实现一个只能在堆上生成对象的类。