委托构造函数
class A
{
public:
A(){}
A(int a)
{
ma = a;
}
A(int a,int b)
{
ma = a;
mb = b;
}
A(int a,int b,int c)
{
ma = a;
mb = b;
mc = c;
}
private:
int ma,mb,mc;
};
我们会发现下面的有参构造函数都是上面的复制后续写 C++11后可以这样写
class A
{
public:
A(){}
A(int a)
{
ma = a;
}
A(int a,int b):A(a)
{
mb = b;
}
A(int a,int b,int c):A(a,b)
{
mc = c;
}
private:
int ma,mb,mc;
};
继承构造函数
继承中通常会出现两种问题:
1.父类有多个构造函数 子类若继承该父类 就要把这些父亲的构造函数都写出来 作为 子类的构造函数
2.父类和子类中有重名函数(即函数重载,但不是虚函数重写),而我们创建子类对象 想调用父亲的重名函数是无法调用的 会编译失败
解决上述两个问题可以用继承构造函数
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
Base(int i) :m_i(i) {}
Base(int i, double j) :m_i(i), m_j(j) {}
Base(int i, double j, string k) :m_i(i), m_j(j), m_k(k) {}
int m_i;
double m_j;
string m_k;
};
class Child : public Base
{
public:
Child(int i) :Base(i) {}
Child(int i, double j) :Base(i, j) {}
Child(int i, double j, string k) :Base(i, j, k) {}
};
int main()
{
Child c(520, 13.14, "i love you");
cout << "int: " << c.m_i << ", double: "
<< c.m_j << ", string: " << c.m_k << endl;
return 0;
}
另外如果在子类中隐藏了父类中的同名函数,也可以通过using的方式在子类中使用基类中的这些父类函数:
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
Base(int i) :m_i(i) {}
Base(int i, double j) :m_i(i), m_j(j) {}
Base(int i, double j, string k) :m_i(i), m_j(j), m_k(k) {}
void func(int i)
{
cout << "base class: i = " << i << endl;
}
void func(int i, string str)
{
cout << "base class: i = " << i << ", str = " << str << endl;
}
int m_i;
double m_j;
string m_k;
};
class Child : public Base
{
public:
using Base::Base;
using Base::func;
void func()
{
cout << "child class: i'am luffy!!!" << endl;
}
};
int main()
{
Child c(250);
c.func();
c.func(19);
c.func(19, "luffy");
return 0;
}