gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C++实现不能被继承的类实例分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

方法一:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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了,这样的话当想派生一个类时,派生类无法构造一个父类,所以就不行了.

方法二:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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++中类的原理及使用.

最后此篇关于C++实现不能被继承的类实例分析的文章就讲到这里了,如果你想了解更多关于C++实现不能被继承的类实例分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com