zoukankan      html  css  js  c++  java
  • 继承构造函数

    在C++的继承关系中,只有虚函数可以被继承,而构造函数不可以是虚函数,所以构造函数不能被继承,但是可以通过某种特殊手段,达到继承的效果。

    先看看C++中using关键字的一个应用 

     1 #include <iostream>
     2 using namespace std;
     3 
     4 struct Base {
     5     void f(double i) {cout << "Base: " << i << endl;}
     6 };
     7 
     8 struct Derived : Base {
     9     using Base::f;
    10     void f(int i) {cout << "Derived: " << i << endl;}
    11 };
    12 
    13 int main() {
    14     Base b;
    15     b.f(4.5);
    16     Derived d;
    17     d.f(4.5);
    18 }

    打印结果如下:

    第9行和第10行为Derived类定义了两个版本的f函数,不管你知道或是不知道,奇怪或是不奇怪,结果就是这样,这就是using关键字的一个小应用。

    而C++11利用using关键字这一特点,是构造函数可以被“继承”。

     1 struct A {
     2     A(int i){}
     3     A(double d, int i){}
     4     A(float f, int i, const char* c){}
     5 };
     6 
     7 struct B:A {
     8     using A::A;
     9     int d{0};
    10 };
    11 
    12 int main() {
    13     B b(217);    // b.d被初始化为0,这是C++11的变量初始化
    14     //B b1;    // 使用继承构造函数的类,编译器不会为其生成默认构造函数
    15 }

    使用继承构造函数特性有一些需要注意的地方:

    1. 如果基类的构造函数被声明为私有函数,或者派生类是从基类虚继承的,那么就不能使用继承构造函数。

    2. 如果一个类使用了继承构造函数,那么编译器将不会为其生成默认的构造函数。

    继承构造函数的特性据说要到g++ 4.8才会被支持,但是我的版本是4.7,所以以上代码还无法编译。

  • 相关阅读:
    XtraForm中OfficeSkins以及BonusSkin皮肤的设置
    XtraForm中更换皮肤
    XtraForm默认皮肤的显示
    wcf异常汇总
    使用JS意识到自己主动提交表单
    怎么样sourceforge开源项目发现,centos安装-同htop安装案例
    战国评论(三)---一起
    Mesos-error
    iOS 执行ScrollView在空白空间-解
    【2014 Multi-University Training Contest 2 1002】/【HDU 4873】 ZCC Loves Intersection
  • 原文地址:https://www.cnblogs.com/lniwn/p/3404548.html
Copyright © 2011-2022 走看看