条件:用C++写一个不能被继承的类,但这个类既可以在栈上实例化也可以在堆上实例化。
如果一个类不能被继承,我第一想到的是这个类的构造函数为private.如果要可以在堆上实例化,我就想到使用静态成员函数模拟构造函数的功能,内部创建堆上对象,返回这个对象的指针。再使用静态成员函数负责释放动态分配的对象。使用静态成员函数也可以创建静态数据区上的对象。但是这种方法不能在栈上实例化。所以方法不行,继续想!
用继承可以么?我先定义一个类A,类A的构造函数声明为private,并声明类B为类A 的友元类。这样B类就可以继承A类了,但是我们是要写一个不能被继承的类。所以我们必须使用虚拟继承来继承类A。如果有一个类继承类B的话,构造对象时必须直接调用虚基类A 的构造函数来初始化对象的基类A部分,并要初始化虚基类表指针,但是类A的构造函数为private不能被该类使用,所以这个类无法顺利的创建对象,因此不能继承类B。
示例代码如下:
#include<iostream>
using namespace std;
template <typename T>
class Base
{
friend T;
private:
Base() {}
~Base() {}
};
class Finalclass : virtual public Base<Finalclass>
{
public:
Finalclass() {}
~Finalclass() {}
};
void main()
{
Finalclass *p = new Finalclass; //堆上对象
Finalclass fs; //栈上对象
}