2015-11-21 27 views
3
class ClassSealer { 
private: 
    friend class Sealed; 
    ClassSealer() {} 
}; 
class Sealed : public ClassSealer 
{ 
    // ... 
}; 
class FailsToDerive : public Sealed 
{ 
    // This class is capable of being instantiated 
}; 

上面没有封闭类,但下面的工作,为什么?C++中的密封类和虚拟继承

class ClassSealer { 
private: 
    friend class Sealed; 
    ClassSealer() {} 
}; 
class Sealed : public virtual ClassSealer 
{ 
    // ... 
}; 
class FailsToDerive : public Sealed 
{ 
    // Cannot be instantiated 
}; 

这里发生了什么事?虚拟继承在这里扮演什么角色?

+6

这种技术是过时的。改为使用新的关键字'final'。 –

+1

@RichardHodges谢谢。但我想知道上面提到的特殊行为背后的原因。 – q126y

回答

6

对于正常继承,派生类的构造函数只调用直接基类的构造函数。因此,在第一个例子中,FailsToDerive的构造函数调用的Sealed构造函数,进而调用的ClassSealer的构造,它被允许做。

一个几乎继承的基的构造,但是,通过在最派生类的构造函数调用。因此,在第二个例子中,FailsToDerive的构造需要能够调用ClassSealer的构造,它是不允许做的,因为它不是ClassSealer的朋友。

+0

你能告诉我在哪里阅读关于构造函数的调用约定。谢谢! – q126y

+1

https://isocpp.org/std/the-standard –

+1

http://en.cppreference.com/w/cpp/language/initializer_list – Brian