`
蒙面考拉
  • 浏览: 160248 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++不能被继承的类

 
阅读更多

 一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有,使得这个类的构造函数对子类不可见,那么这个类也就不能继承了。但是,这引出一个问题,客户程序岂不是也无法实例化这个类了?OK,让我们参考一下Singleton模式,用一个static函数来帮助创建这个类的实例,问题就解决了!

class CParent
{
private:
    CParent(int v){m_v = v;}
    ~CParent(){}

    int m_v;
    static CParent * m_instance;
public:
    void fun(){cout << "The value is: " << m_v << endl;}
    static CParent * getInstance(int v);
    static void DeleteInstance( CParent* pInstance)
  {
  delete pInstance;
  pInstance = 0;
  }
};
CParent * CParent::m_instance = NULL;

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

 这是一个有效的方法,但是static函数创建出来的实例必然是static。而且,这个类不能像普通的类那样构建对象,比如:

CParent c;  // impossible

 

现在设想一下,有一个CParent类,我们不希望他能够被继承。在友元不能被继承的思路指引下,我们要考虑让CParent的友元属性不能被继承。假设有一个辅助类CNoHeritanceCParentCNoHeritance类的友元。还要假设一个CChild类,它试图去继承CParent类(如果它有这个能耐的话)。

先把CNoHeritance类的构造函数定义成private,然后将CParent声明为CNoHeritance的友元类。同时CParent继承了CNoHeritance类。到目前为止,CNoHeritance除了CParent类以外,谁也无法对它进行访问和实例化。CChild因为无法继承CParent的友元特性,所以CChild无法对CNoHeritance直接进行实例化(但是可以通过CParent)。

        到目前为止,CParent还是可以被继承的。这是一个trick.让我们整理一下思路,下面的图说明了CNoHeritance, CParent和CChild三个类之间的关系。

如果我们让CParent类虚继承CNoHeritance类,根据虚继承的特性,虚基类的构造函数由最终的子类负责构造。因此CChild如果要想继承CParent,它必须能够构造CNoHeritance,这是不可能的!因此,我们的CParent也就终于成为了一个无法继承的类。

class CNoHeritance
{
private:
    CNoHeritance(){}
    ~CNoHeritance(){}
    friend class CParent;
};

class CParent : virtual public CNoHeritance
{
public:
    CParent(int v){m_v = v;}
    ~CParent(){};
private:
    int m_v;

public:
    void fun(){cout << "The value is: " << m_v << endl;}
};

class CChild : public CParent
{
public:
    CChild():CParent(10){}
    ~CChild(){}
};

 

 

分享到:
评论

相关推荐

    C++不能继承的类

    在C++编程语言中,有时候我们可能需要创建一个类,使其不能被其他类继承,以保护类的结构和防止不合理的扩展。标题所提到的"不能继承的类",其目的是为了实现一种类的封闭性,确保其设计的意图不被误用。描述中提到...

    c++抽象类继承

    根据给定的信息,我们可以深入探讨C++中的抽象类与继承机制。下面将详细介绍如何通过抽象类和继承在C++中实现特定的功能。 ### 概述 在这个示例中,我们有三个具体的类:`Student`、`Lecture` 和 `Module`,它们都...

    c++中类的继承派生关系图谱

    这是张图谱,是关于c++中类的继承派生关系图谱,从基类cobject到各个类!

    c++继承分类

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以扩展已存在的类的功能。在这个“c++继承分类”主题中,我们将深入探讨C++中的继承机制,以及如何在Qt环境中利用这一特性进行开发...

    C++类继承内存布局详解图(一目了然)

    "C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...

    C++实现一个不能被继承的类

    用C++实现一个不能被继承的类,适合初学者

    C++继承与派生类实验报告

    C++继承与派生类是面向对象编程的重要概念,它们允许我们创建新的类,这些类可以从现有的类(称为基类或父类)继承属性和行为。在这个实验中,我们将深入理解这两个概念,并通过实际编程练习来巩固它们。 一、继承...

    c++类继承关系

    c++类继承关系 Hierarchy Chart 继承关系 基类CObject派生出的各类,MSDN中用

    C++类的继承性说明

    在C++中,如果派生类从多个基类继承了同名成员函数,那么在不提供明确的调用路径时,编译器无法确定应该调用哪个版本。为了解决这个问题,可以使用作用域解析运算符`::`来指定调用哪个基类的`SetWeight`方法,例如`...

    C++类的继承与实现

    `表示纯虚函数,这样的类被称为抽象类,不能实例化。 多态性分为编译时多态和运行时多态。编译时多态主要通过函数重载和运算符重载实现,即在同一作用域内,函数名相同但参数列表不同,或者操作符的含义不同。运行...

    c++课件 派生类与继承

    c++课件 派生类与继承

    c++程序设计 继承与派生实验(二)

    保护成员在派生类中可见,但不能直接访问,必须通过派生类的成员函数或者基类的成员函数来访问;而公有成员在派生类中依然保持公有,可以直接访问。理解这一点对于设计安全和封装良好的类至关重要。 最后,我们要...

    C++类的继承方式

    详细介绍c++类的继承方式,public、private、protect。

    C++类继承,访问权限,有源码参考

    - **protected继承**:基类的public和protected成员在派生类中变为protected,保护了基类的一些成员不被非友元类直接访问。 - **private继承**:基类的public和protected成员在派生类中变为private,子类不能直接...

    类的继承练习_inheritance_类的继承练习_C++_pineoce_

    在C++编程语言中,类的继承是面向对象编程(OOP)的一个核心概念,它允许我们创建一个新类(子类或派生类),该类不仅拥有已存在的类(父类或基类)的特性,还能添加新的特性和功能。这种机制有助于代码重用,降低...

    实现C++类的多重继承

    当一个派生类从两个间接基类继承,而这两个间接基类又共同继承自一个共同的基类时,可能出现访问冲突的问题,这被称为钻石问题。C++默认采用二义性解析,可以通过虚继承(virtual inheritance)来解决。 5. **虚...

    实现c++类的多重继承的例程

    在C++编程语言中,多重继承是一种特性,允许一个派生类从多个基类中继承属性和行为。这种设计模式增强了代码的复用性,并且能够构建复杂的类层次结构。以下是一个关于如何实现C++类的多重继承的详细解释。 首先,让...

    C++多继承Demo

    C++通过虚继承(virtual inheritance)来解决这个问题,确保只有一个版本的祖先类被继承。虚拟基类的声明如下: ```cpp class Base { public: // ... }; class Middle1 : virtual public Base { public: // ... ...

    C++ 类继承图 所有类关系

    C++ MSDN的类总图,显示了所有类 之间的关系 非常有用!~~

Global site tag (gtag.js) - Google Analytics