C++实现一个不能被继承的类
创始人
2024-03-27 01:45:50
0

文章目录

    • 方法一:构造方法私有化 + static公有方法访问构造方法
    • 方法二:构造方法私有化 + 友元类 + 虚继承
    • 方法三:使用final关键字

方法一:构造方法私有化 + static公有方法访问构造方法

最直观的解决方法就是将其构造函数声明为私有的,这样就可以阻止子类构造对象了。但是这样的话,就无法构造本身的对象了,就无法利用了

既然这样,我们又可以想定义一个静态方法来构造类和释放类

#include
using namespace std;
class A{public:static A * Construct(int n){A *pa = new A;pa->num = n;cout<<"num is:"<num<delete pIntance;pIntance = NULL;}private:A(){}~A(){}public:int num;};int  main(){A *f = A::Construct(9);cout<num<

按照理论分析,这样做确实可以做到防止被继承

注意:又有一个新的问题,这种实现原理和单例模式一模一样,就是只能在堆上创建,无法再栈上实现这个类

这就是私有的构造函数的局限性

方法二:构造方法私有化 + 友元类 + 虚继承

主要思想,设计一个模板辅助类Base,将构造函数声明为私有的;再设计一个Base的友元类FinalClass,并且将FinalClass虚继承自Base

#include using namespace std;template 
class Base {friend T;
private:Base() {cout << "base" << endl;}~Base() {}
};class FinalClass : virtual public Base {// 一定注意,必须是虚继承,只有虚继承才能让派生类完成虚基类的构造// 普通继承下派生类不用负责最顶层基类的构造
public:FinalClass() {cout << "FinalClass()" << endl;}
};class C :public FinalClass {
public:C() {}     //继承时报错,无法通过编译
};int main() {FinalClass b;      //B类无法被继承//C c;return 0;
}

为什么一定要使用虚继承?

如果不使用虚继承,C构造时调用FinalClass 的构造函数,FinalClass的构造函数能调用Base的构造函数,C成功继承FinalClass类,这不是我们想要的

如果使用虚继承,由于此时的Base是虚基类,C中出现Base成员的地方都会用vbptr替换,并且把Base成员移动到C对象内存的最末尾处,由C类的构造函数负责初始化Base的数据成员,因此构造C的构造函数必须直接调用Base的构造函数,而C无法访问Base的构造函数,C继承FinalClass失败

之所以使用虚继承,是想让派生类直接访问虚基类的构造函数,如果不能访问虚基类的构造函数,当前类就无法构造对象

方法三:使用final关键字

class FinalClass final {
public:FinalClass() {}
};

相关内容

热门资讯

小型加工厂投资项目(家庭小工厂... 现在想创业的人越来越多,要选择办厂来达到创业致富的目的。在下面的内容中,我们会知道有哪些项目适合一个...
解析 物格而后知至,知至而后意... 解析 物格而后知至,知至而后意诚,意诚而后心正……这是《大学》里的话,是大学八条目,你随便找一本大学...
请问我这个配置,用这个电源可以... 请问我这个配置,用这个电源可以吗?最近老是出现开机几次才启动的状况,是否电源供电不足?电源功率足够了...
成语大挑战,一个红心上面一朵花... 成语大挑战,一个红心上面一朵花,答案是什么成语?主谓式。形容极其高兴、定语,连说成语大挑战一个红心上...
舒曼的作品有哪些 舒曼的作品有哪些  主要作品有:  (1)钢琴独奏:奏鸣曲三首,“少年奏鸣曲”三首,三乐章《幻想曲》...
淘宝里的宝贝属性类目是什么意思 淘宝里的宝贝属性类目是什么意思我的宝贝因为类目放错被下架,但我不懂属性类目是什么意思,有谁能帮我解释...
关于东露天矿的归属,是属于中煤... 关于东露天矿的归属,是属于中煤能源集团还是抚顺矿业集团?谁知到的告诉一下。谢谢。你说的中煤集团建安公...
什么花的花语是守护 什么花的花语是守护桔梗 传说:女巫桔梗爱上了一个叫犬夜叉的妖怪,两人却因为一个误会背道而驰,终生无法...
为什么足球场地草坪颜色有深有浅... 为什么足球场地草坪颜色有深有浅,为什么足球场地草坪颜色有深有浅,要有根据,具体是为什么,谁最先提出的...
纯水精灵位置 纯水精灵位置1、纯水精灵在大地图的位置。2、纯水精灵详细位置在无妄坡的右上角和石门北偏西的湖中央扩展...