我找到了这段代码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
有人能解释一下这段代码吗?
编辑:我还有另外一个问题是什么是虚拟推导以及何时需要?
答案 0 :(得分:5)
这是virtual
推导的属性。
virtual
推导的想法是解决“可怕的钻石模式”:
struct Base {};
struct D1: Base {};
struct D2: Base {};
struct TopDiamond: D1, D2 {};
此处的问题是TopDiamond
此处有Base
的2个实例。
为了解决这个非常特殊的“MultiInheritance”问题,C ++使用了virtual
关键字以及所谓的“虚拟继承”。
如果我们更改D1
和D2
的定义方式,那么:
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;
它会调用Usable
和Usable_Lock
的构造函数(因为DD
派生自Usable
而Usable
派生自Usable_lock
)
因此它无法访问Usable_Lock的构造函数..它会给你错误
答案 2 :(得分:1)
这里有两点:
1)为什么可以创建可用实例,尽管它涉及私有Usable_lock构造函数?因为Usable是Usable_lock的朋友。
2)为什么无法创建可用的派生实例?因为它涉及私有的Usable_lock构造函数。