首页 / C++ / 用C++实现一个不能被继承的类
用C++实现一个不能被继承的类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了用C++实现一个不能被继承的类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2279字,纯文字阅读大概需要4分钟。
内容图文
![用C++实现一个不能被继承的类](/upload/InfoBanner/zyjiaocheng/1131/c015206309024b99ac59f40a301e87f3.jpg)
1 #include<iostream> 2usingnamespace std; 3class Gradpa 4{ 5 friend class Parent;//声明public或者private都无影响 6private: 7 Gradpa(){ 8 cout<<"I m Gradpa"<<endl; 9 }; 10 ~Gradpa(){}; 1112}; 1314class Parent: virtualpublic Gradpa 15{ 16public: 17 Parent(){ 18 cout<<"I m Parent"<<endl; 19 }; 20 ~Parent(){}; 21}; 2223class Child:public Parent 24{ 25public: 26 Child(){ 27 cout<<"I m Child"<<endl; 28 } 29 ~Child(){} 30}; 3132int main() 33{ 34//Gradpa* gra=new Gradpa; //构造函数声明为private,不能直接访问35 Parent* par=new Parent; //通过声明一个friend 类,访问private的构造函数36 Child * chd=new Child; //子类能够继承父类,但是Parent加上virtual 后变成虚继承,Child类就得直接去访问Gradpa,导致出错。保证Parent类不能被继承37 system("pause"); 38return0; 3940 }
错误 1 error C2248: “Gradpa::Gradpa”: 无法访问 private 成员(在“Gradpa”类中声明) e:\my projects\不能被继承的类.cpp 26
可参考详细转载,转载地址为:http://blog.163.com/xiangzaihui@126/blog/static/166955749201182295845689/
在C++中,子类的构造函数会自动调用父类的构造函数子类的析构函数也会自动调用父类的析构函数。
要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。
那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。
可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?这难不倒我们,我
们可以通过定义静态来创建和释放类的实例。基于这个思路,我们可以写出如下的代码:
class FinalClass1
{
public
:
static FinalClass1*
GetInstance()
{
return
new FinalClass1;
}
static void DeleteInstance(
FinalClass1* pInstance)
{
delete
pInstance;
pInstance = 0;
}
private
:
FinalClass1()
{}
~FinalClass1()
{}
};
这个类在基本上就能实现不能继承的功能。但是每次如果你都用这样一个类的话,估计你到最后不是你的程序崩溃了,而是你自己崩溃的更早。
因此,我们这样设计。
class CFinalClassMixin
{
friend class
CParent;
private:
CFinalClassMixin(){}
~CFinalClassMixin(){}
};
class
CParent: public
CFinalClassMixin
{
public:
CParent(){}
~CParent(){}
};
class
CChild : public
CParent
{
};
但是发现没有用,想一想也是,CChild构造函数调用CParent的构造函数,而CParent的构造函数再调用CFinalClassMixin的构造函数,很显然是合法的。
我估计你也想骂了,唧唧歪歪讲了这么就还是不行。
但是请你想想,如果我是在CChild的构造函数直接调用CFinalClassMixin的构造函数,而CFinalClassMixin的构造函数是private,不能被调用,那我们岂不是达到了目的,但是我们如何才能在CChild中直接调用CFinalClassMixin的构造函数而不是通过CParent去调用了。
给你一分钟去想想。。。。。。。。。。。。。。
哈哈虚继承,虚继承刚好可以实现上述目的。
因此:
class CFinalClassMixin
{
friend
class
CParent;
private:
CFinalClassMixin(){}
~CFinalClassMixin(){}
};
class
CParent: virtual public
CFinalClassMixin
{
public:
CParent(){}
~CParent(){}
};
哈哈发现CParent不再可以被继承了。
如果你不懂虚继承是个神马东东的话,你可以参考我的另外一篇文章:
虚继承
如果你看懂了,我相信你就懂了上述的方法了。
原文:http://www.cnblogs.com/xxiaoye/p/3670321.html
内容总结
以上是互联网集市为您收集整理的用C++实现一个不能被继承的类全部内容,希望文章能够帮你解决用C++实现一个不能被继承的类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。