`
kmplayer
  • 浏览: 497260 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现:不能被继承的类

阅读更多
1,首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函数、析构函数而导致编译错误。

2,可是这个类的构造函数和析构函数都是私有函数了,我们怎样才能得到该类的实例呢?
我们可以通过定义静态来创建和释放类的实例。

3,先看一个基本的实现:
实例代码:
#include <iostream>
using namespace std ;

class FinalClass
{
private: //public:
    //只把构造函数设置为私有就可以了.
    FinalClass(int i = 3) : val(i) {}
public:
    static FinalClass GetInstance(int i = 3) //设法返回对象
    {
        FinalClass tmp(i);
        return tmp;
    }
    int getVal()
    {
        return val;
    }
private:
    int val;
};

class DFinal : public FinalClass
{
public:
};

int main()
{
    FinalClass f1 = FinalClass::GetInstance(3);
    cout << f1.getVal() << endl;
    DFinal f2;
    cout << f2.getVal() << endl;
	return 0 ;
}

4,一个借助于模板的巧妙实现:
#include <iostream>
using namespace std ;

template<typename T>
class MakeFinal
{
    friend T; //这里编译有错
private:
    MakeFinal() {}
    ~MakeFinal() {}
};

class FinalClass : virtual public MakeFinal<FinalClass>
{
public:
    FinalClass() {}
    ~FinalClass() {}
};

/*
class Try : public FinalClass
{
public:
    Try() {}
    ~Try() {}
};
*/

int main()
{
	return 0 ;
}

解析:
由于类FinalClass是从类MakeFinal<FinalClass>虚继承过来的,在调用Try的构造函数的时候,会直接跳过FinalClass而直接调用MakeFinal<FinalClass>的构造函数。非常遗憾的是,Try不是MakeFinal<FinalClass2>的友元,因此不能调用其私有的构造函数。


分享到:
评论

相关推荐

    Python语言基础:类的多重继承.pptx

    多重继承是指一个子类通过继承的方式来... print("要吃东西,不能进行光合作用") #大类 class Mammal(Animal): def how_to_birth(self): print("胎生") class Bird(Animal): def how_to_birth(self): print("卵生")

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

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

    1.1:抽象方法与抽象类.pdf

    抽象类与抽象方法由abstract修饰 ...1.抽象类不能被实例化,只能被其他类继承 2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。) 3.抽象类就是为了重写→多态。

    C++实现不能被继承的类实例分析

    本文实例展示了C++实现不能被继承的类的方法,对于C++初学者而言有一定的学习借鉴价值。具体实现方法如下: 方法一: #include using namespace std; class A { public: static A* getInstance(); static void ...

    C++中如何使类不能继承

    要实现一个不能被继承的类有很多方法。  主要的思路是使子类不能构造父类的部分,这样子类没有办法实例化整个子类。这样限制了子类的继承。所以我们可以将父类的构造函数声明成为私有的,但是这样父类不不能实例...

    MVC框架揭秘

    当一个类被声明为 sealed 时,它不能被继承。 象类不能被声明为 sealed。bstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象包含抽象方法,抽象方法可被派生类实现。...

    《java面向对象程序设计-继承和多态》教案.doc

    接口就是某个事物对外提供的一些功能的申明 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 使用interface关键字定义接口 一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 ...

    用C++编写不能被继承的类

     在Java中定义了关键字final,被final修饰的类不能被继承。但在C++中没有final这个关键字。  首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数...

    PHP Trait代码复用类与多继承实现方法详解

    众所周知,一直以来PHP和很多语言一样是单继承的语言,但是常常在编码过程中,我们需要在当前类中使用两个或两个以上的其他类的方法,这种情况下继承就不能实现,而往往采用new方式实例化很多要用到的类,这样就会很...

    1.5:接口和抽象类的区别.pdf

    5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。 6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 7.接口中的方法...

    期末大作业-继承及派生类的设计及应用 (C++程序设计 包含课程综合性实验报告)

    能学到什么:学习了解C++中的继承以及派生,对C++中的继承以及派生还不太熟悉的同学来说是一份非常好的学习内容。 阅读建议:通过本资源可以了解C++中的继承以及派生的应用,若您着急也可以直接使用该资源提交作业。

    C#中类和结构的区别 -- 示例详解

    没有 abstract 和 sealed(因为不能继承) 不能有protected 修饰符 可以不使用new 初始化 在结构中初始化实例字段是错误的 类: 有默认的构造函数 有析构函数 可以使用 abstract 和 sealed 有protected 修饰符...

    Java抽象类和接口的深度解析.pptx.pptx

    抽象类是Java中一种特殊的类,它不能被实例化,只能被继承。抽象类主要用于定义一些通用的属性和方法,子类需要实现这些方法。 接口的基本概念 接口是Java中一种特殊的抽象类型,它只包含抽象方法和常量,不包含任何...

    dot Net中抽象类与接口的区别

    例如,Struct就可以继承接口,而不能继承类。 通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些...

    1.3:接口的特点总结.pdf

    接口不能被实例化(接口是特殊抽象类,抽象类中可能有抽象方法,实例化没有意义)。 接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。(默认为public) 接口中的成员不能有任何实现(...

    C#中实现多继承的方法

    相信涉猎c#不多的人(像我这样的菜鸟),一看就觉得很可笑,c#肯定是不能实现多继承的啊。都知道在c++中因为实现多继承会有很多的歧义问题,所以在c#中就把多继承给取消了,而用接口来实现!但是想想,如果是初学者...

    C++设计类不能被继承的方法实例讲解

    在Java 中定义了关键字final,被final修饰的类不能被继承,C++中如何实现,下面我们来看一个例子

    详解C++基础——类继承

    OOP设计思想中类的继承相比来说更为灵活,可以添加新的数据成员和方法,也能修改继承下来方法的实现细节,同时还保留了原有的代码。开始进入正题。 二、类继承示例 场景如下:现需要记录乒乓球运动成员的信息,包括...

    ,NET概念问题总结.doc

    不能被派生。 b.不能同时为抽象类。 2:重载和覆写有什么区别? 答:a.重载提供一个对一个方法签名不同参数调用的实现。 b.覆写提供了子类中改变父类方法行为的实现。 3:什么是抽象类(abstract class)? 答:一种不...

Global site tag (gtag.js) - Google Analytics