继承构造函数
C++11允许派生类继承基类的构造函数
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
Base(int age, int id)
:m_age(age)
, m_id(id)
{
cout << "Base" << endl;
}
private:
int m_age;
int m_id;
};
class Derive : public Base
{
public:
#if 0
// 通过参数列表给基类构造函数传参
Derive(int age, int id)
:Base(age, id)
,temp(0)
{
}
#endif
// 继承构造
using Base::Base;
private:
int temp;
};
int main()
{
Derive d(12,45);
system("pause");
return 0;
}
注意:
- 继承构造函数只能用于始化基类的成员变量,对于派生类新增成员变量无法进行初始化。这也意味着继承构造函数适用于基类有多个构造函数,而派生类没有添加新的成员变量的场景
- 继承会继承所有的构造函数,同时继承构造函数与默认函数(默认构造,析构,拷贝等)一样时隐式的,也就是说某个继承的构造函数如果不被调用,就不会生成相关的代码
- 如果基类的构造函数被声明为私有,那么不能继承构造函数
- 我们可以理解为继承到的构造函数会将函数名修改成派生类类名,通过下图可以看出。
- 在多继承的情况下,如果发生了继承冲突,我们可以通过显式的定义继承类中冲突函数来解决,如下所示
显式定义冲突函数后
委托构造
和继承构造类似,委托构造函数也是C++11中对C++的构造函数的一项改进,其目的是为了减少程序员书写构造函数的时间。
如果一个类包含多个构造函数,C++11允许在一个构造函数的定义中使用另一个构造函数,但这必须通过初始化列表进行操作,如下:
委托构造
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test(int a)
:Test(a, 'a')
{
cout << "Test(int a)" << endl;
}
Test(char c)
:Test(1, c)
{
cout << "Test(char c)" << endl;
}
Test()
:Test(1, 'c')
{
cout << "Test()" << endl;
}
private:
Test(int a, char c)
{
cout << "test(int a, char c)" << endl;
}
};
int main()
{
Test t1(1);
Test t2('c');
system("pause");
return 0;
}
运行结果
继承控制:final和override
C++11之前,一直没有继承控制关键字,禁止一个类的近一步衍生比较麻烦
C++11添加了两个继承控制关键字:final和override
final的作用
- 阻止类的近一步衍生
- 阻止虚函数的近一步重写
class A final // 加上final,指定A1不能派生
{
};
class B : public A // err
{
};
class A1
{
virtual void func() final //该虚函数是最终版本了,不能再重写了
{
cout << "hello world" << endl;
}
};
class B1 : public A1
{
virtual void func() // err
{
cout << "crue world" << endl;
}
};
override确保派生类中声明的函数和基类的虚函数有相同的签名
class A1
{
// 继承体系顶端的类中虚函数不能加override
virtual void func()
{
cout << "hello world" << endl;
}
};
class B1 : public A1
{
// 在重写虚函数的地方,加上override,要求重写的虚函数和基类一样
virtual void func() override
{
cout << "crue world" << endl;
}
};