且行且珍惜
书到用时方恨少非君子
C++博客
首页
新随笔
联系
聚合
管理
随笔-3 评论-4 文章-0 trackbacks-0
在C++中禁止类继承
在CoreJava 7 中提到C++中没有类似final的关键字,因此无法直接实现禁止类继承,但是
Cay S. Horstmann
又说可以通过一些小技巧达到同样的效果,留作思考,但提示说用到虚基类。
究竟是如何的“技巧”呢,很惭愧,虚基类忘得快没影了,于是Google大神之,摘录如下:
下面的代码将会禁止继承:
class
A;
class
Lock
{
friend
class
A;
private
:
Lock()
{}
}
;
class
A :
virtual
public
Lock
{
//
public
:
A()
{}
A(
int
t)
{}
}
;
现在,如果你尝试从类A派生其它类将会得到类似下面这样的编译错误。
class
B :
public
A
{}
;
//
Lock::Lock' : cannot access private member declared in class 'Lock'
这是因为派生类都需要调用虚基类的构造函数,因此从A派生的B需要调用虚基类的构造函数(也就是Lock的构造函数),而Lock的构造函数是私有的,类B又不是Lock的友元,所以这将会产生一个编译错误。
如果我们移除类A派生时的virtual关键字,程序将会成功编译。这是因为在非虚拟继承中,任何类都可以调用直接父类中的构造函数。因此,在非虚拟继承中,B将调用它的直接父类A的构造函数而A将调用它的直接父类Lock的构造函数,这都是合法的。
posted on 2007-01-11 18:27
Sunus
阅读(3107)
评论(3)
编辑
收藏
引用
所属分类:
C&C++
评论:
#
re: 在C++中禁止类继承 2007-08-14 21:17 |
linwen
“现在,如果你尝试从类A派生其它类将会得到类似下面这样的编译错误。 ”
派生是没有错的,只有在实例化派生类时才错。
回复
更多评论
#
re: 在C++中禁止类继承 2007-08-14 21:32 |
linwen
这样就没有问题了,所以还要把copy constructor 也声明为private。
#include <iostream>
using namespace std;
class A;
class Lock {
friend class A;
private:
Lock() {}
};
class A : virtual public Lock {
public:
A(){}
A(int t){}
};
class B : public A
{
public:
B(): Lock(*(new A))
{ }
};
int main()
{
B b;
getchar();
}
回复
更多评论
#
re: 在C++中禁止类继承[未登录]
2007-08-14 21:54 |
sunus
谢谢提醒,确实~~~
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
PHP
句柄类思想
在C++中禁止类继承
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
2007年1月
>
日
一
二
三
四
五
六
31
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
1
2
3
4
5
6
7
8
9
10
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(3)
C&C++(3)
算法&杂谈
随笔档案
(3)
2007年1月 (3)
搜索
最新随笔
1. PHP
2. 句柄类思想
3. 在C++中禁止类继承
最新评论
1. re: 句柄类思想
struct handle:cheshire {
应该是:
struct handle::cheshire {
写成这样像话吗? 拷贝改都不改废物一个。
--alex_
2. re: 在C++中禁止类继承[未登录]
谢谢提醒,确实~~~
--sunus
3. re: 在C++中禁止类继承
评论内容较长,点击标题查看
--linwen
4. re: 在C++中禁止类继承
“现在,如果你尝试从类A派生其它类将会得到类似下面这样的编译错误。 ”
派生是没有错的,只有在实例化派生类时才错。
--linwen
阅读排行榜
1. 在C++中禁止类继承(3107)
2. 句柄类思想(2380)
3. PHP(409)
评论排行榜
1. 在C++中禁止类继承(3)
2. 句柄类思想(1)
3. PHP(0)