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

标签 c++

我想知道以下两个代码的确切区别。我很清楚,如果我正在创建派生类的对象,那么这两个程序都会抛出错误。发生这种情况是因为基类的构造函数是私有(private)的。

我正在使用以下版本的 gcc gcc 版本 4.8.3 20140627 [gcc-4_8-branch 修订版 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;
}

最佳答案

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

关于c++ - 在继承的情况下,编译器创建默认构造函数和用户创建默认构造函数之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49314466/

相关文章:

c++ - 无效 C 风格强制转换后的方法调用

c++ - 为什么 INT_MIN 的绝对值与 INT MAX 不同?

c++ - 根据另一个 vector 对点 vector 进行排序

c++ - [文字游戏]Quiddler Solver Algorithm

c++ - 在 linux 中使用 fork() 时使用指针的引用值

c++ - 我该如何修复 "Invalid use of void expression"? C++

c++ - Boost 1.64 和 Visual Studio 2017 的问题

c++ - 如何将长文档字符串放入 c/c++ 程序中?

c++ - unique_ptr 矩阵

c++ - Eigen LSCG 求解器性能问题