我们知道,一个类之所以可以被继承到子类,是因为该类的构造函数和析构函数都是公有的(因为构造子类的时候,一定是先要调用父类的构造函数)。如果我们将一个类的构造函数和析构函数都写成私有或者保护,那么它就不会被继承下去。看下边的代码:
class B
{
public:
static B& GetObject()
{
return *(new B);
}
private:
B()
{}
~B()
{}
};
class D:public B
{
public:
D()
{}
~D()
{}
};
void test()
{
B::GetObject;
D d;
}
程序运行结果如下图:
这样,我们就可以看出,这个B类是不可以被继承的,所以,B类这样定义貌似是没有问题的,然而,如果你看过了我的上一篇文章,你就会知道,这个B类啊,可以生成对象,但是只能在堆上生成对象,不能再栈上生成对象,所以,这种方法并不是很好,继续优化~
我们能否写出一个类,它不仅满足 不能被继承,也满足,不仅能在堆上生成对象,也能在栈上生成对象。看下边的代码:
class D;
class B
{
friend D;
private:
B()
{}
~B()
{}
};
class D:virtual public B
{
public:
D()
{}
~D()
{}
};
class E: public D
{
public:
E()
{}
~E()
{}
};
void test()
{
D d;
E e;
}
运行之后的结果是:
从上边的图片我们可以看出,D类确实是不能被继承的类,所以,就认为我们的代码是正确的。
感谢阅读~~