我在这里找到了这段代码
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)
有人可以解释一下这段代码吗?
编辑:我还有另一个问题是什么是虚拟推导,何时需要?
这是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关键字和所谓的"虚拟继承".
如果我们改变方式D1并D2定义为:
struct D1: virtual Base {};
struct D2: virtual Base {};
Run Code Online (Sandbox Code Playgroud)
那么只会有一个实例Base内TopDiamond:实际上实例这是留给顶部构造函数(这里的工作TopDiamond).
因此,您所展示的小技巧只是在这里解释:
Usable实际上是派生的Usable_lock,所以由它的派生类来实例化Usable_lock对象的一部分Usable_lock构造函数是private,只有它自己和Usable(朋友)可以访问构造函数它很聪明,我从未想过这一点.我想知道virtual继承的成本是多少(额外的内存/速度开销)?
| 归档时间: |
|
| 查看次数: |
919 次 |
| 最近记录: |