当前位置: 首页 > 编程笔记 >

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

慕容恩
2023-03-14
本文向大家介绍C++实现不能被继承的类实例分析,包括了C++实现不能被继承的类实例分析的使用技巧和注意事项,需要的朋友参考一下

本文实例展示了C++实现不能被继承的类的方法,对于C++初学者而言有一定的学习借鉴价值。具体实现方法如下:

方法一:

#include <iostream>

using namespace std;

class A
{
public:
  static A* getInstance();
  static void deleteInstance(A* pA);

private:
  A() { cout << "construct A\n";}
  ~A() { cout << "destruct A\n"; }
};

A* A::getInstance()
{
  return new A;
}

void A::deleteInstance(A* pA)
{
  delete pA;
  pA = nullptr;
}

int main()
{
  A* pA = A::getInstance();
  A::deleteInstance(pA);
  cin.get();
}

该方法其实就是把构造函数、析构函数private了,这样的话当想派生一个类时,派生类无法构造一个父类,所以就不行了。

方法二:

#include <iostream>

using namespace std;

template <typename T>
class A
{
  friend T;
private:
  A(int data) : m_data(data) { cout << "construct A. data: " << m_data << endl; }
  ~A() {}

  int m_data;
};

class B : virtual public A<B>
{
public:
  B(int data) : A(data) { cout << "construct B\n"; }
  ~B() {}
};


int main(void)
{
  B b(4);
  cin.get();
}

类B设置为类A的友元,这样类B作为A的子类就可以构造一个父类了。这时候类B可以正常使用,但是不能从类B派生一个子类,因为B虚继承A,如果想 class C : pulic B 的话,由于是虚继承,那么在C类的构造函数就得直接调用A类的构造函数,但是B是A的友元,C不是,所以无法直接调用A的构造函数,编译出错。这里C类必须直接调用A的构造函数的

但是如果你把B类的声明改为 class B : public A<B> 的话,那么又可以从B类派生一个子类C了,因为不用虚继承的话,在C类的构造函数调用B类的构造函数,B类的构造函数再调用A类的(B是A的友元,即使A的构造函数是private也无妨)。这是一层层向上调用的。

相信通过本文实例可以帮助大家更好的理解C++中类的原理及使用。

 类似资料:
  • 本文向大家介绍Python实现类继承实例,包括了Python实现类继承实例的使用技巧和注意事项,需要的朋友参考一下 Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,本文就举一例Python类继承的实例。 实例代码如下: 运行结果:

  • 本文向大家介绍C#中事件的继承实例分析,包括了C#中事件的继承实例分析的使用技巧和注意事项,需要的朋友参考一下 通常来说,C#中的子类无法调用父类的事件,但是可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件。 具体实现代码如下: 希望本文所述对大家的C#程序设计有所帮助

  • 本文向大家介绍javascript实现继承的简单实例,包括了javascript实现继承的简单实例的使用技巧和注意事项,需要的朋友参考一下 作为一门面向对象的语言,那么继承自然就是一大特征,下面是一段非常简单代码实例,它演示了实现继承的基本原理,有兴趣的或者恰好要学习此方面的朋友可以参阅一下,希望能够给大家来帮组。 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍C++继承中的访问控制实例分析,包括了C++继承中的访问控制实例分析的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的探讨了C++继承中的访问控制,对深入掌握C++面向对象程序设计是非常必要的。具体内容如下: 通常来说,我们认为一个类有两种不同的用户:普通用户 和 类的实现者。其中,普通用户编写的代码使用类的对象,这部分代码只能访问类的公有(接口)成员;实现者则负责编写类的成员

  • 例如,我有一个名为Animal的基类。 子类可以实现以下一个或多个接口: 我有3个子类: 现在我有了一个方法,我想接受我知道的动物(狗或猫)。有没有一种方法可以在不确定是哪种动物的情况下到达界面?这样做会很好: 我不想把IShed接口变成另一个抽象类,因为Cat和Snake都需要实现IBeAJerk接口。但是蛇不会蜕皮。(实际上我猜蛇会蜕皮,但你明白我的意思。) 谢谢你的帮助!

  • 如果我为各种品牌的汽车建模,我会使用继承层次结构,还是仅仅改变构造函数参数? 关于是使用继承还是仅通过重复使用同一类来关联对象,一般的规则是什么? 对于汽车,我可以做一些像新车(“保时捷”、“991”、“3.8”)这样的事情,或者我可以有一个整体抽象的汽车超类,有像“保时捷”这样的抽象子类制造商,然后可能为保时捷的每个型号都有一个类?