2

以下代码如何工作?MakeFinal 构造函数受到保护,因此 FinalUser 类不应访问它。但我没有收到任何构建或执行错误。

class MakeFinal
{
protected:
    MakeFinal(void) {};

public:
    ~MakeFinal(void) {};
};

class Final : virtual public MakeFinal
{
public:
    Final(void) {};
    ~Final(void) {};
};

class FinalUser : public Final
{
public:
    FinalUser(void) {};
    ~FinalUser(void) {};
};

int main()
{
    FinalUser *finalUserHeap_ = new FinalUser();
    return 0;
}
4

3 回答 3

2

基类virtual由单个最派生类的构造函数的成员初始化器列表初始化。

因为virtual基类可以是多个派生类的公共基类对象,而这些派生类指定的初始化可能会发生冲突。

最派生类中的初始化规范在概念上就像最派生类直接派生自virtual基类一样,即

FinalUser(void) {};

… 相当于

FinalUser(): MakeFinal() {}

由于MakeFinal构造函数是protected,因此它可用于所有派生类。

这包括它对 class 可用FinalUser


在其他新闻中:

此代码中的名称表明它是关于使用 C++03 技巧来创建一个不能(有用地)从“最终”类派生的类。诀窍本质上是拥有一个可以充当大多数派生类的类模板,并且具有必要的-ship 来访问基类friend的其他类不可访问的构造函数。virtualC++11 引入了关键字final来更容易地做到这一点,并且没有virtual继承的开销。

于 2016-06-25T06:08:41.903 回答
1

你需要知道下一个:

如果继承是public,那么所有知道 Base 和 Child 的东西也都知道 Child 继承自 Base。

如果继承是protected,则只有 Child 及其子级知道它们从 Base 继承。

如果继承是private,那么除了 Child 之外没有人知道继承。

@Anzurio 回答私有、公共和受保护继承之间的差异

据此。private如果您希望FinalUser该类无权访问,则需要使用MakeFinal.

于 2016-06-25T05:57:47.597 回答
0

派生类可以访问其基类的受保护成员。protected这就是和之间的区别private

于 2016-06-25T05:55:49.647 回答