在私有继承中公开构造函数

Posted

技术标签:

【中文标题】在私有继承中公开构造函数【英文标题】:Publicizing a constructor in private inheritance 【发布时间】:2012-05-07 08:31:30 【问题描述】:

在私有继承期间,基类的公共成员变量或成员函数可以在 Derived 中分配回公共访问说明符。 但是我们可以对 Base 类的公共构造函数做同样的事情吗?

我试过如下,

#include <iostream>

using namespace std;

class base

      public:
             base()
             void print() puts("In print"); 
;

class derived : private base

      public:
             base::print;
             base::base;   /* Throws an error - Declaration doesnt declare anything*/
             void display() puts("In display"); 
;

int main()

    derived dObj;

它抛出一个错误“声明没有声明任何东西” 我尝试的方法有效吗?

【问题讨论】:

这很有趣。但是为什么要作为私有继承然后提供公共访问呢? 没有 C++11,你不能从基类继承构造函数——它们要么被派生类的构造函数显式调用,要么隐式调用。对于您希望在derived 中使用的来自base 的其他方法,您需要using 关键字。 @tuxuday - 我读到,如果我们私下继承并希望只为一个或几个成员而不是整个基类提供公共访问权限,我们可以这样做。它适用于成员变量和函数。我也尝试过构造函数。 @void-pointer - 所以这意味着即使继承了基类的构造函数也不会被派生继承。事实上,如果没有明确定义,编译器会为每个类的继承层次结构生成一个单独的默认构造函数? 不,构造函数永远不会自动继承——在 C++11 中,您可以通过 using 显式继承所有基类的构造函数。不管derived的后代的构造函数是否自动生成,它们仍然没有被derived.继承 【参考方案1】:

您可以使用using 语法。但它对using 基类构造函数没有多大意义。我猜你想初始化你的基类,对吧?你可以这样做:

#include <iostream>

using namespace std;

class base

      public:
             base()
             void print() puts("In print"); 
;

class derived : private base

      public:
             using base::print;
             derived() : base()  // initialize base class
             void display() puts("In display"); 
;

int main()

    derived dObj;

【讨论】:

是的,我可以这样初始化基类构造函数,我只是在尝试是否可以在派生中重新分配对基类构造函数的公共访问权限。 好吧,那为什么不给它一个trial。你会得到一个错误:'base::base’ names constructor. @user2k5:因为试验只告诉你编译器的行为,而不是标准所说的行为应该是什么。如果我没记错的话,C++11 使语法合法,但是 ideone 的 gcc 版本(甚至对于 C++0x)还没有实现它。 @MatthieuM。我知道 C++11 支持从基类继承(全部或全部)构造函数。上面我只是想表明它对没有 C++11 的 using 基类构造函数没有任何意义。

以上是关于在私有继承中公开构造函数的主要内容,如果未能解决你的问题,请参考以下文章

通过定义默认私有构造函数使类不可继承

为啥不能将继承的受保护构造函数公开?

为啥具有私有构造函数的类不阻止从此类继承?如何控制哪些类可以从某个基类继承?

必须公开聚合字段构造函数才能在 C++ 中使用聚合初始化吗?

有没有办法让以前公开的无参数构造函数私有化,而不会对 protobuf(反)序列化进行重大更改?

Typescript构造函数和继承