首页 > 编程语言 >C++11:类的改进

C++11:类的改进

时间:2022-09-28 19:03:52浏览次数:52  
标签:11 int 派生类 C++ 改进 基类 Test public 构造函数


继承构造

C++ 11允许派生类继承基类的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。

#include <iostream>
using namespace std;

//基类
class A
{
public:
A(int x, int y)
{
a = x;
b = y;
}

protected:
int a;
int b;
};

//派生类
class B:public A
{
public:
#if 0
//通过参数列表给基类构造函数传参
B(int x, int y): A(x, y)
{

}
#endif
//继承构造
using A::A;

void display()
{
cout << "a = " << a << ", b = " << b << endl;
}

//没有增加新的成员变量
int tmp;
};

int main()
{
//派生类对象
B obj(10, 20);
obj.display();

return 0;
}

注意:

  • 继承的构造函数只能初始化基类中的成员变量,不能初始化派生类的成员变量
  • 如果基类的构造函数被声明为私有,或者派生类是从基类中虚继承,那么不能继承构造函数
  • 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数

委托构造

和继承构造函数类似,委托构造函数也是C++11中对C++的构造函数的一项改进,其目的也是为了减少程序员书写构造函数的时间。

如果一个类包含多个构造函数,C++ 11允许在一个构造函数中的定义中使用另一个构造函数,但这必须通过初始化列表进行操作,如下:

#include <iostream>
using namespace std;

class Test
{
public:
//委托构造,一定要通过初始化列表方式
Test():Test(1, 'a')
{

}

Test(int x): Test(x, 'b')
{

}

Test(char x): Test(11, x)
{

}

int a;
char b;

private:
Test(int x, char y): a(x), b(y)
{

}
};

int main()
{
//Test obj; // Test():Test(1, 'a')
Test obj('z');
cout << obj.a << endl;
cout << obj.b << endl;

return 0;
}

继承控制:final和override

C++11之前,一直没有继承控制关键字,禁用一个类的进一步衍生比较麻烦。

C++ 11添加了两个继承控制关键字:final和override。

final阻止类的进一步派生和虚函数的进一步重写:

//final阻止类的进一步派生,虚函数的进一步重写
#if
class A1 final //加上final,指定A1不能派生
{
int a;
};

class A2: public A1 //err, 基类不能再派生了
{

};
#endif

//基类
class B1
{
public:
virtual void func() final {} //这是最终版本的虚函数,不能再重写

};

//派生类重写基类的虚函数
class B2: public B1
{
public:
//virtual void func() {} //err, 基类中的虚函数是最终版本,不能再重写

override确保在派生类中声明的函数跟基类的虚函数有相同的签名:

class A1
{
public:
//这是第一个虚函数,没有重写,不能用override修饰
virtual int func(int a)
{

}
};

class A2:public A1
{
public:
//在重写虚函数地方,加上override, 要求重写的虚函数和基类一模一样
virtual int func(int b) override


标签:11,int,派生类,C++,改进,基类,Test,public,构造函数
From: https://blog.51cto.com/u_3002289/5720712

相关文章

  • C++11:右值引用
    左值、右值在C语言中,我们常常会提起左值(lvalue)、右值(rvalue)这样的称呼。一个最为典型的判别方法就是,在赋值表达式中,出现在等号左边的就是“左值”,而在等号右边的,则称为“右......
  • DFS算法练习 POJ1111; POJ1129; POJ2245; POJ2657
    POJ1111:importjava.util.Scanner;/***@Authorjinjun99*@DateCreatedin2022/9/279:49*@Description*@Sinceversion-1.0*/publicclassMain{......
  • 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口
    【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口 使用的环境:VisualStudio2017,创建一个控制台程序作为工程文件1.配置glfw在github上下载GLFW......
  • C++11:初始化
    类内成员初始化classMem{public:Mem(inti):m(i){}//初始化列表给m初始化intm;};classGroup{public:Group(){}private:intdata=1;//使用"=......
  • C++11:移动语义
    为什么需要移动语义#include<iostream>usingnamespacestd;classTest{public:Test(inta=0){//普通构造函数d=newint(a);cout<<"构造函......
  • C++11:std::move和std::forward
    标准库函数std::move既然编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数......
  • Java11安装(win11)
    下载JDK解压版本下载后解压,并放到一个没有中文路径的目录,如图所示:配置Java环境变量以Windows11系统为例,打开设置,搜索“环境”,点击“编辑系统环境变量”,如图所示:点击......
  • c++可执行文件产生过程
    https://blog.csdn.net/qq_34799070/article/details/125472381#ifndefTEST#defineTEST#include<iostream>usingnamespacestd;voidtest(){cout<<"h......
  • C++问题汇总——长期更新
    避免使用vector<bool>,尽量使用bitset或者deque<bool>因为vector<bool>不是容器,底层是bool值按bit存储STLlist容器数据结构上看是带空头的双向循环链表容器迭代......
  • 视频融合云平台EasyCVR级联时出现报错“Error 1146",是什么原因?
    EasyCVR具备强大的视频接入、汇聚与管理、视频分发、设备管理、用户及角色权限管理等能力。平台可提供的丰富的视频功能,包括:视频监控直播、云端录像、云存储、录像检索与回......