c++11 继承构造函数
若基类拥有数量众多的不同版本的构造函数,而派生类中只有一些成员函数,则对于派生类而言,其构造函数就等同于构造基类。
struct A {
A(int i) {}
A(double d, int i) {}
A(float f, int i, const char* c) {}
//...
}; struct B : public: A {
B(int i): A(i) {}
B(double d, int i): A(d, i) {}
B(float f, int i, const char* c): A(f, i c) {}
//...
virtual void ExtraInterface() {}
};
如上,B继承于A,只添加了一个接口,但在构造B时想要拥有A这样的构造方法时,就必须一一透传各个接口。
在C++中,如果派生类想要使用基类的成员函数,可以通过using声明来完成。如下:
#include <iostream>
using namespace std; struct Base {
void f(double i) { cout << "Base: " << i << endl; }
}; struct Derived: Base {
public:
using Base::f;
void f(int i) { cout << "Derived: " << i << endl;}
}; int main() {
Base b;
b.f(4.5); // Base: 4.5 Derived d;
d.f(4.5); // Base: 4.5
d.f(4); // Derived: 4
return ;
}
基类和派生类都声明了函数f,而使用过using声明后,派生类也可以使用基类版本的函数f,这样派生类中就有了两个f函数的版本。
在c++11中,此方法扩展到构造函数上,子类可以通过using声明来声明继承基类的构造函数。在刚开始的代码可以改造成如下:
struct A {
A(int i) {}
A(double d, int i) {}
A(float f, int i, const char* c) {}
}; struct B : A {
using A::A;
virtual void ExtraInterface() {}
};
通过 using A::A的声明,将基类中的构造函数悉数集成到派生类B中。且标准继承构造函数和派生类的各种类默认函数(默认构造、析构、拷贝构造等)一样,是隐式声明的。意味着一个继承构造函数不被相关代码使用,则编译器不会为其产生真正的函数代码。
若基类构造函数含有默认值,则对于继承构造函数来说,参数的默认值不会被继承,但会导致基类产生多个构造函数的版本,而这些函数版本都会被派生类继承。
struct A {
A(int a = , double b = 2.4);
}; struct B : A{
using A::A;
};
A的构造函数可能有A(int = 3, double = 2.4); A(int = 3); A(const A &); A();则相应地,B中的构造函数也会有:
B(int, double); B(int); B(const B &); B();
若碰到继承构造函数冲突的问题,需要通过显示定义继承类的冲突的构造函数,阻止隐式生成相应的继承构造函数。如下:
struct A { A(int) {} };
struct B { B(int) {} }; struct C: A, B {
using A::A;
using B::B; //会造成冲突
}; //使用显示定义来解决:
struct C: A, B {
using A::A;
using B::B; C(int) {} //显示定义
};
注意的问题:
如果基类的构造函数被声明为私有成员函数,或者派生类是从基类中虚继承的,那么就不能够在派生类中声明继承构造函数。且一旦使用继承构造函数,编译器就不会再为派生类生成默认构造函数。
struct A { A(int) {}}; struct B : A { using A::A; }; B b; //B没有默认构造函数
c++11 继承构造函数的更多相关文章
- C++11中的继承构造函数
时间:2014.06.19 地点:基地 ------------------------------------------------------------------------- 一.问题描写 ...
- c++11 继承构造
c++11 继承构造 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。
js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } Class ...
- 深入浅出javascript(十二)继承——构造函数继承和组合继承
#题记: 有一水果类,抽象出属性包括:name(水果品种),price(价格),id(ID号).现有两个子类,分别为苹果,桔子,希望继承水果父类. 一.构造函数继承 构造函数继承相当把父类的属性在子类 ...
- js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。
js一种继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA ...
- c++11 继承控制:final和override
c++11 继承控制:final和override #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <str ...
- C++11:移动构造函数的测试
C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> ...
- c++11的构造函数继承
https://en.cppreference.com/w/cpp/language/using_declaration 在[Inheriting constructors]这一节. 其实叫做"基类的 ...
随机推荐
- 【加密】RSA验签及加密
通过OpenSSL生成公私钥文件(如果没有OpenSSL工具建议下载Cmder工具自带OpenSSL指令) 1.生成RSA密钥的方法 genrsa -out private-rsa.key 2048 ...
- Hadoop编程调用HDFS(PYTHON)
1.运行环境 开发工具:PyCharm Python 版本:3.5 Hadoop环境: Cloudera QuickStart 2.GITHUB地址 https://github.com/nbfujx ...
- CSS中的一些伪类
一.:nth-child 和 :nth-of-type (1):nth-child() :nth-child(n) 选择器选取某任意一父元素的第 n 个子元素( p:nth-child(n) 即选中任 ...
- 【LeetCode 73】矩阵置零
题目链接 [题解] 如果a[i][j]==0. 就把第i行的第一个数字置为0 然后把第j列的第一个数字置为0 最后再处理下每行第一个为0的行.每列第一个为0的列. (第一行和第一列都得用同一个位置处理 ...
- Key Set
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1011&cid=594 Key Set Time Limit: 2000 ...
- U-Boot是什么
U-Boot U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目.U-Boot的作用是系统引导.U-Boot从FADSROM.8xxROM.PPCBOOT逐 ...
- Linux配置Selenium+Chrome+Python
---恢复内容开始--- 最近一个月没有更新博客了.最近都在复习LINUX与PYTHON知识.决定以后在LINUX环境下学习新知识. 包括后期的框架学习与平台知识方面. 直接记录今天下午的学习成果. ...
- error C2065: ‘__in’ : undeclared identifier
转自VC错误:http://www.vcerror.com/?p=1307 问题描述: 编译时出现: error C2065: '__in' : undeclared identifier error ...
- Raft Paper 简译
本文是对 Raft Paper 核心部分的意译,不包括原文中的如下章节:<3 Paxos 的优缺点论述>.<4 Raft 的易理解性介绍>.<9 Raft 算法的易理 ...
- 正则search与match的区别
import re # #1.search和match的区别 # pattern = re.compile(r'\d+') # #match从头开始匹配 # m = pattern.match('on ...