无法派生的类

时间:2010-04-14 12:36:52

标签: c++

我找到了这段代码here

class Usable;

class Usable_lock {
    friend class Usable;
private:
    Usable_lock() {}
    Usable_lock(const Usable_lock&) {}
};

class Usable : public virtual Usable_lock {
    // ...
public:
    Usable();
    Usable(char*);
    // ...
};

Usable a;

class DD : public Usable { };

DD dd;  // error: DD::DD() cannot access
        // Usable_lock::Usable_lock(): private  member

有人能解释一下这段代码吗?

编辑:我还有另外一个问题是什么是虚拟推导以及何时需要?

3 个答案:

答案 0 :(得分:5)

这是virtual推导的属性。

virtual推导的想法是解决“可怕的钻石模式”:

struct Base {};

struct D1: Base {};
struct D2: Base {};

struct TopDiamond: D1, D2 {};

此处的问题是TopDiamond此处有Base的2个实例。

为了解决这个非常特殊的“MultiInheritance”问题,C ++使用了virtual关键字以及所谓的“虚拟继承”。

如果我们更改D1D2的定义方式,那么:

struct D1: virtual Base {};
struct D2: virtual Base {};

然后Base中只有TopDiamond的一个实例:实际实例化它的工作留给顶层构造函数(这里是TopDiamond)。

因此,您所展示的小技巧只是在这里解释:

  • 因为Usable实际上是从Usable_lock派生的,所以由派生类来实例化对象的Usable_lock部分
  • 因为Usable_lock构造函数是private,只有自己和Usable(朋友)可以访问构造函数

这很聪明,我从未想过这一点。我想知道virtual继承的成本是多少(额外的内存/速度开销)?

答案 1 :(得分:1)

class Usable_lock的构造函数在Private下声明 所以外面无法访问

Usable_lock class 

当您制作

的对象时
 DD dd;

它会调用UsableUsable_Lock的构造函数(因为DD派生自UsableUsable派生自Usable_lock

因此它无法访问Usable_Lock的构造函数..它会给你错误

答案 2 :(得分:1)

这里有两点:

1)为什么可以创建可用实例,尽管它涉及私有Usable_lock构造函数?因为Usable是Usable_lock的朋友。

2)为什么无法创建可用的派生实例?因为它涉及私有的Usable_lock构造函数。