无法派生的类

Vij*_*jay 4 c++

我在这里找到了这段代码

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
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_* M. 5

这是virtual推导的属性.

virtual推导的想法是解决"可怕的钻石图案":

struct Base {};

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

struct TopDiamond: D1, D2 {};
Run Code Online (Sandbox Code Playgroud)

这里的问题是这里TopDiamond有2个实例Base.

为了解决这个非常特殊的"MultiInheritance"这个问题,C++使用了virtual关键字和所谓的"虚拟继承".

如果我们改变方式D1D2定义为:

struct D1: virtual Base {};
struct D2: virtual Base {};
Run Code Online (Sandbox Code Playgroud)

那么只会有一个实例BaseTopDiamond:实际上实例这是留给顶部构造函数(这里的工作TopDiamond).

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

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

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