C++创建 可以实例化但不能继承的类
2013-08-28 12:58
288 查看
class vb{
private:
vb(){}
friend C;
}
//vb这个是一个基类,它的构造函数是private,因此它根本就无法被创建。但是我们显式增加了一个friend C。因此只有C才能创建vb。这是关键点。
class C:virtual public vb{
};
//C虚拟继承自vb,这样在构造C的时侯,需要调用vb的默认构造函数,虽然vb的构造函数是private的,但是由于C是vb的friend,因此我们可以自由的在栈上,堆上建立C的实例。例如:
C c;
C *pc = new C;
都没有问题。
但是下面我们会看到,C已经成了一个final class,它无法在被任何其他class继承。
例如:
class D : public C //编译错误
D尝试继承自C,C又虚拟继承了vb,虚拟继承的一个特性是,被虚拟继承的基类(指vb)总是在派生层次最深的类(指D)中构造,因此D需要访问vb的构造函数才能将自己建立起来。由于vb的构造函数是private,而且仅仅指定了唯一的一个friend C,因此D是无权访问vb::vb(),也就根本无法通过编译。
这样,C也成为了一个无法被继承的类。vb和虚拟继承是它的一个实现手法。
#include <iostream>
using namespace std;
class va
{
friend class vb;
private:
va(){}
~va(){}
};
class vb:public virtual va{};
class vc:public vb {};
int main()
{
vc a;//实例化才报错,虚拟集成会跳过vb的构造函数,去执行va的,但是vc不是va的友元
}
private:
vb(){}
friend C;
}
//vb这个是一个基类,它的构造函数是private,因此它根本就无法被创建。但是我们显式增加了一个friend C。因此只有C才能创建vb。这是关键点。
class C:virtual public vb{
};
//C虚拟继承自vb,这样在构造C的时侯,需要调用vb的默认构造函数,虽然vb的构造函数是private的,但是由于C是vb的friend,因此我们可以自由的在栈上,堆上建立C的实例。例如:
C c;
C *pc = new C;
都没有问题。
但是下面我们会看到,C已经成了一个final class,它无法在被任何其他class继承。
例如:
class D : public C //编译错误
D尝试继承自C,C又虚拟继承了vb,虚拟继承的一个特性是,被虚拟继承的基类(指vb)总是在派生层次最深的类(指D)中构造,因此D需要访问vb的构造函数才能将自己建立起来。由于vb的构造函数是private,而且仅仅指定了唯一的一个friend C,因此D是无权访问vb::vb(),也就根本无法通过编译。
这样,C也成为了一个无法被继承的类。vb和虚拟继承是它的一个实现手法。
#include <iostream>
using namespace std;
class va
{
friend class vb;
private:
va(){}
~va(){}
};
class vb:public virtual va{};
class vc:public vb {};
int main()
{
vc a;//实例化才报错,虚拟集成会跳过vb的构造函数,去执行va的,但是vc不是va的友元
}
相关文章推荐
- C++创建一个类(1.只能在堆上创建; 2 只能在栈上创建; 3 不能被继承(堆上和栈上都可以创建))
- C++创建一个类(1.只能在堆上创建; 2 只能在栈上创建; 3 不能被继承(堆上和栈上都可以创建))
- c++ 设计一个不能被继承的类,但可以实例化
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
- 如何利用c++编写不能被继承、但可以在类外定义对象的类
- C++不能继承与实例化问题
- 用c++设计一个类,这个类只能被实例化3次,且不能被继承
- 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)
- 菜鸟学习abstract【一个类可以被继承但不能实例化,子类不需要重新定义属性】
- C++中结构体与类的区别(结构不能被继承,默认是public,在堆栈中创建,是值类型,而类是引用类型)good
- 使用C++设计一个类,该类最多能被实例化3次且不能被继承
- C#使用_如何创建既不能被继承又不能被实例化的类
- C++ 创建一个不能被继承的类
- C++:1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。
- 对于c/c++中char型可以输入整型,而int型却不能输入字符
- 为什么C++赋值运算符重载函数不能被继承?
- 用C++实现一个不能被继承的类
- C++中如何使类不能被继承
- 不能被继承的类[C/C++/C#]
- C++ 中不能被继承的类实现,及从中体现virtual 继承的一个特性