您的位置:首页 > 其它

怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?

2011-10-05 15:14 357 查看
“怎么防止类被继承?对于不能被继承的类,怎么初始化及销毁它的实例?”这是ADOBE公司的一道笔试题。

看了这道题目,笔者查阅了一些资料并结合自己的一些想法,写了这篇博客,有错误的地方请指出,谢谢。

首先看怎么防止类被继承。这里面介绍一种借用虚继承和友元机制实现的方法。其实说到底,防止一个类被继承,我们还是想怎么使的派生类在构造时不能够调用基类的构造函数,从而不能完成继承。我们都知道,派生类对象初始化时,首先要运行基类构造函数,将基类子对象进行初始化,之后再运行派生类的构造函数,初始化派生类中特质不同的成员。下面介绍一种方法:

#include <iostream>

using namespace std;

class Base1;

class Base{

public:

~Base(){cout<<"Base::~Base()"<<endl;}

friend class Base1;

private:

Base(){cout<<"Base::Base()"<<endl;}

};

class Base1: virtual public Base{ //虚继承

public:

Base1(){cout<<"Base1::Base1()"<<endl;}

~Base1(){cout<<"Base1::~Base1()"<<endl;}

};

class Drived: public Base1{

public:

Drived(){cout<<"Drived::Drived()"<<endl;}

~Drived(){cout<<"Drived::~Drived()"<<endl;}

};

int main(){

Drived D;

}

首先定义一个基类Base,但在Base类中,其构造函数被定义为私有的。接下来Base1虚继承Base类,Base类成了虚基类,而Base1是Base的友元,可以调用Base的构造函数初始化对象。但是到了派生类Drived时候,它是最低层的派生类,按照规则“最低层派生类的构造函数初始化虚基类”,Drived类跨过Base1直接调用Base类中的构造函数去初始化虚基类部分的子对象,然而由于Base类的构造函数是私有的,Drived类的构造函数无权调用,因此初始化失败。这就导致了一个有趣的现象,Drived类继承Base1类,结果由于无法调用虚基类Base的构造函数而无法完成对象的创建,给人的感觉就是Base1类无法被继承。

再来看看问题的后半部分“对于不能被继承的类,怎么初始化及销毁它的实例?”这里不能被继承的类是Base1类,但是Base1类如果创建对象的话,可以正常的调用Base类和Base1类的构造函数和析构函数完成初始化和销毁操作。这也说明了,虚继承具有这样的特点:类A虚继承类B,类A的操作一切都正常,造成影响的是A的派生类C。因为虚基类A的派生类C要在构造非虚基类B之前去构造虚基类A。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐