我正在尝试学习C ++继承,但是一件事对我来说没有任何意义。 关于派生类未继承的内容的所有搜索结果表明,构造函数,friend和operator =均未继承。但是,此信息与我的程序的结果不符。
我做了一个继承的例子,结果如下:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout << "constructor base class without parameters" << endl;
}
Base(int a)
{
cout << "constructor base class with int parameter" << endl;
}
Base(const Base& b)
{
cout << "copy constructor base class" << endl;
}
Base& operator= (const Base& base)
{
cout << "operator= base class" << endl;
}
};
class Derived: public Base
{
};
int main()
{
Derived d;
cout << endl << "here 1" << endl << endl;
Derived d2 = d;
cout << endl << "here 2" << endl << endl;
d = d2;
//Derived d3 (3); // ERROR!!
}
输出为:
constructor base class without parameters
here 1
copy constructor base class
here 2
operator= base class
如果不是所有的构造函数和operator =都继承,为什么调用operator =,基类的默认构造函数和副本构造函数?
答案 0 :(得分:3)
Dervied没有构造函数,在这种情况下,将生成一个默认构造函数,该构造函数将调用所有基类和成员的默认构造函数。
类似的事情发生在复制构造函数和赋值运算符上。自动生成的派生类版本将调用基类版本。
这与构造函数或赋值运算符的继承无关。
答案 1 :(得分:0)
类不要自动继承构造函数,尽管您可以强制它们向基类的构造函数提供using
语句:
class Derived: public Base
{
public:
// Force this class to provide the base class's constructors
using Base::Base;
// Force this class to provide the base class's assignment operator
using Base::operator=;
};
复制构造函数也不被继承。相反,编译器会自动为派生类生成一个副本构造函数。如果一个类的所有成员变量和基类都是可复制的,则该类本身是可复制的,它将自动生成复制构造函数。
相同的规则适用于赋值运算符:如果类的所有成员都提供了副本赋值运算符,则编译器会自动为该类本身生成一个。
答案 2 :(得分:-1)
复制/移动构造函数是根据标准的例外。
参考标准
对于候选集合中的每个非模板构造函数继承 没有参数或没有参数的构造函数以外的构造函数 复制/移动具有单个参数的构造函数,构造函数为 隐式声明具有相同的构造函数特性,除非 在用户声明的构造函数中,具有相同的签名 出现使用声明或构造函数的完整类 将是该类的默认,复制或移动构造函数。
PS。 Base& operator = (const Base& base)
不是构造函数。是分配。因此,它的工作原理与其他任何成员函数一样。由于在您的示例中它是公开的,因此它是继承的。