在继承的情况下,编译器创建默认构造函数和用户创建默认构造函数之间的区别

时间:2018-03-16 06:28:21

标签: c++

我想知道以下两个代码的确切区别。我很清楚,如果我正在创建Derived类的对象,则程序都会抛出错误。这是因为基类的构造函数是私有的。

我正在使用以下版本的gcc gcc版本4.8.3 20140627 [gcc-4_8-branch revision 212064](SUSE Linux)

请让我知道为什么第一个程序在编译时没有显示任何错误。但第二个显示编译中的错误。

No error
****************************************
class Base
{
    private:
    Base()     
    {
         cout << "Base constructor" << endl;    
    }
};
class Derived:public Base
{
};
int main()
{
    return 0;
}


Throwing Error at compilation time
*****************************************
class Base
{
    private:
    Base()
    {
         cout << "Base constructor" << endl;
    }
};
class Derived:public Base
{
    public:
    Derived()
    {
    }
};
int main()
{
     return 0;
}

1 个答案:

答案 0 :(得分:3)

编译器为第一个Derived隐式声明的默认构造函数被定义为已删除;如果您尝试使用该构造函数,将发生编译错误。在第二个Derived中显式声明的构造函数尝试调用私有基础构造函数,因此定义本身是格式错误的。