C++定义一个不能被继承的类

如何定义一个不能被继承的类???

假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢???

方法1:
我们可以在类内创建一个对象并提供一个静态的接口,返回创建的这个对象。但是如果使用这种方法的话,在定义B的对象的时候感觉不是很完美。

这种写法有点类似于单例:

#include <iostream>
class CParent
{
private:
    CParent(int v){m_v = v;}
    ~CParent(){}

    int m_v;
    static CParent * m_instance;
public:
    void fun(){std::cout << "The value is: " << m_v << std::endl;}
    static CParent * getInstance(int v);
};

CParent *CParent::getInstance(int v)
{
    return new CParent(v);
}

int main() {
    CParent *parent = CParent::getInstance(10);
    parent->fun();
}

方法2:
我们可以声明一个辅助的类A,把类A的构造函数声明为私有的,并使得B是A的友元类,且B虚继承A。让B是A的友元类的目的在于能够让B访问A的私有构造函数,这样继承自A的B才可以被实例化。

假设现在有一个类D继承B,在D初始化的时候会先调用B类的构造函数,但是由于B虚继承A,所以为了防止产生二义性,D必须先调用A的构造函数,由于A的构造函数是私有的不可访问,所以会产生错误,继承会失败。

class B;
//设计一个不能被继承的类
class A
{
       friend B;
private:
       A() {}
};
class B :virtual public A
{
public:
       B() {}
};

在这里插入图片描述

方法3:
c++11标准提供关键字final。将类声明为final即可。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值