实现一个不能被继承的类
程序员文章站
2022-07-15 20:31:01
...
分析
普通类都能被继承,但当这个类的构造函数被声明为私有时,这个类便不能被继承,同时也不能在类外面定义该类型的对象,该怎么解决这个问题呢?
方法一:类对象的构造是通过构造函数实现的,如果将构造函数声明为私有或者保护类型,那么在类外是不能调用构造函数的,也就不能在类定义出对象。对此,我们可以在类里定义一个公有的接口返回成员函数生成的对象,之后在类外定义类时,只需调用这个函数即可 ,但这样还有缺陷,因为在类外只能通过类的对象来调用这个成员函数,所以应将这个接口声明为静态的。
方法二:先定义一个辅助类AA,将其构造函数定义为私有的,然后让BB虚继承AA(BB同时也要是AA的友元类,为了让BB可以使用AA的构造来合成其构造函数)。此时CC类是无法继承BB类的,因为CC类在初始化时会先调用BB的构造函数,但BB虚继承AA,为了避免二义性,CC必须先调用AA的构造函数,而AA的构造函数是私有的,不可见,导致编译器报错。
实现
//方法一
class AA
{
private:
AA()
{}
public:
static AA* GetAAObj()
{
return new AA;
}
static AA GetAAOBj()
{
return AA();
}
protected:
int _aa;
};
class BB : public AA
{
};
//方法二
class AA
{
friend class BB;
private:
AA(int aa)
:_aa(aa)
{}
protected:
int _aa;
};
class BB : virtual public AA
{
public:
BB(int bb)
:AA(10)
, _bb(bb)
{}
protected:
int _bb;
};
class CC : public BB
{
CC(int cc)
:BB(20) //AA的构造函数不可用,编译器报错
, _cc(cc)
{}
protected:
int _cc;
};
下一篇: python-os模块演练
推荐阅读
-
Javascript中类式继承和原型式继承的实现方法和区别之处
-
一个用php实现的获取URL信息的类
-
.net工具类 分享一个简单的随机分红包的实现方式
-
PHP取得一个类的属性和方法的实现代码
-
实现了一个PHP5的getter/setter基类的代码
-
java继承:定义交通工具类Vehicle,一个小车类Car,一个公共汽车Bus类,实现Car、Bus对Vehicle的继承
-
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
-
一个接口多个实现类,如何调用哪个实现类的方法
-
php实现的一个很好用HTML解析器类可用于采集数据
-
JavaScript原型的工作原理(以及如何利用它来实现类的继承)