随笔-3  评论-4  文章-0  trackbacks-0
   在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 阅读(3106) 评论(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
谢谢提醒,确实~~~  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理