C++中,可以通过私有化构造函数实现禁止创建栈对象,但是这样的类属于抽象类,又如何能够被实例化?
"只定义了protected构造函数的类也是抽象类。"
那么对于“禁止创建栈对象”这个问题,本身抽象类就不能实例化,是否问题本身就没有意义了呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
"只定义了protected构造函数的类也是抽象类。"
那么对于“禁止创建栈对象”这个问题,本身抽象类就不能实例化,是否问题本身就没有意义了呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
先理清一下“抽象类”,要指出的是:抽象类不能被实例化,但不能被实例化的类不一定就是抽象类。比如:
这不叫抽象类,因为它没有包含纯虚函数。如果想用类名来声明一个对象是编译不过的,这就是你问题中提到的“禁止创建栈对象”。
但这样的类是有用的,给它添加点代码,比如
虽然在类A外不能声明对象,但在A自己里面完全可以,然后别人可以这样使用:
这就是著名的“单例模式”。
在C++里,抽象类的定义就是包含有纯虚函数的类,比如
所谓的抽象类不能实例化对象,指的是
在编译的时候都会报错。
而“只定义了protected构造函数的类也是抽象类”这个话其实是不对的,或者说如果这句话是对的,那么这里的抽象类就是一个广义的抽象类,也就是说这里的抽象类借鉴了Java的说法,就是不能实例化对象的类认为就是“抽象类”。 因为抽象类的产生就是为了描述接口的,而如果仅仅是构造函数不是公有的类,其存在的意义可能并不是为了精准描述接口的。
具体的例子可以参见jk_v1的单例描述,对于C++的抽象类,你是无法创建一个实例的。