目的:构建一个不允许继承的类;试图冒犯者,直接让你在编译时就挂掉
注释:
A类是父类,作用是辅助B类不可被继承
B类是不可继承的类,即我们希望实现的类
D类是试图继承B类的类,结果是我们期望的:不能编译通过
为了测试,实现了一个main函数
a.h
- //父类
-
#pragma once
-
#include "P.h"
-
template <class T> class A
-
{
-
friend T; //T为子类类型,便于子类可访问该类的私有构造和析构函数
-
private: //记得这里需要把构造和析构函数放在私有成员里面
-
A(void);
-
~A(void);
-
};
-
-
//模板类的成员实现要和定义放在一个文件里面,否则编译出错
-
-
template<class T>
-
A<T>::A(void)
-
{
-
cout<<"A::A(void)"<<endl;
-
}
-
-
template<class T>
-
A<T>::~A(void)
-
{
-
cout<<"A::~A(void)"<<endl;
-
}
b.h
- //不可继承的类
-
#pragma once
-
#include "a.h"
-
-
class B :
-
virtual public A<B> //这里必须添加virtual,否则B类的子类还能继承B
-
{
-
public:
-
B(void);
-
~B(void);
-
};
b.cpp
- #include "B.h"
-
#include "P.h"
-
-
B::B(void)
-
{
-
cout<<"B::B(void)"<<endl;
-
}
-
-
-
B::~B(void)
-
{
-
cout<<"B::~B(void)"<<endl;
-
}
d.h
- //试图继承不可继承B类的类,当然,这个类不会编译成功
-
#pragma once
-
#include "b.h"
-
-
class D
-
:public B //这里试图继承B类,可是会编译出错,目的达到了,哇咔咔
-
{
-
public:
-
D(void);
-
~D(void);
-
};
d.cpp
- #include "D.h"
-
#include "P.h"
-
-
D::D(void)
-
{
-
cout<<"D::D(void)"<<endl;
-
}
-
-
-
D::~D(void)
-
{
-
cout<<"D::~D(void)"<<endl;
-
}
p.h
- //公共使用头文件
-
#pragma once
-
#include <iostream>
-
using namespace std;
main.cpp
- //测试
-
#include "B.h"
-
#include "D.h"
-
-
void test(void);
-
-
int main(void)
-
{
-
test();
-
return 0;
-
}
-
-
void test(void)
-
{
-
B b; //这样是OK的
-
//D d; //这样就是不OK的,其实不是这里通不过,是D类根本就不可以继承B类,哇咔咔
-
}
最后给出D类在Visual Studio 2010上编译时的错误
- d.cpp(5): error C2248: 'A::A' : cannot access private member declared in class 'A'
-
1> with
-
1> [
-
1> T=B
-
1> ]
-
1> e:\program\c++\finalyclass\finalyclass\a.h(8) : see declaration of 'A::A'
-
1> with
-
1> [
-
1> T=B
-
1> ]
原理分析:
D类的构造函数不能构造爷爷类(A类),因为A类的构造函数是私有的,它当然无权访问了,失败是理所当然的
B类之所以可以构造父类(A类),是因为在A类中声明了其子类(B类)是A类的友元类(friend T);所以B类可以访问的A类的私有成员(包括构造和析构函数)
阅读(2170) | 评论(1) | 转发(1) |