继承和派生--继承中对构造函数、同名函数的处理方式
1 继承中的构造和析构
先调用父类构造,再调用其他成员构造(其他类作为派生类的成员),再调用自身构造 ,析构的顺序与构造相反。
#include <iostream>
using namespace std;
// 基类
class Base
{
public:
Base()
{
cout << "Base构造" << endl;
}
~Base()
{
cout << "Base析构" << endl;
}
};
// 其他类
class Other
{
public:
Other()
{
cout << "Other构造" << endl;
}
~Other()
{
cout << "Other析构" << endl;
}
};
// 派生类
class Derive : public Base
{
public:
Derive()
{
cout << "Derive构造" << endl;
}
~Derive()
{
cout << "Derive析构" << endl;
}
Other other; // 其他类作为派生类的成员
};
int main()
{
Derive derive;
return 0;
}
2 继承中的同名成员处理
当子类重新定义了父类中的同名成员函数,子类的成员函数会隐藏掉父类中所有重载版本的同名成员,可以利用作用域显示指定调用。
#include <iostream>
using namespace std;
class Base
{
public:
void showAge()
{
cout << "Base::m_Age = " << m_Age << endl;
}
int m_Age;
};
class Derive : public Base
{
public:
void showAge()
{
cout << "Derive::m_Age = " << m_Age << endl;
}
int m_Age;
};
int main()
{
Derive derive;
derive.m_Age = 10;
derive.showAge();
// 利用作用域访问父类中的同名成员
derive.Base::m_Age = 20;
derive.Base::showAge();
return 0;
}
3 继承中的同名静态成员处理
当子类重新定义了父类中的同名成员函数,子类的成员函数会隐藏掉父类中所有重载版本的同名成员,可以利用作用域显示指定调用。(结论与同名普通成员一致,只不过调用方式有两种:1.通过对象,2.通过类名)
#include <iostream>
using namespace std;
class Base
{
public:
static void showAge()
{
cout << "Base::m_Age = " << m_Age << endl;
}
static int m_Age; // 类内声明
};
int Base::m_Age = 18; // 类外初始化
class Derive : public Base
{
public:
void showAge()
{
cout << "Derive::m_Age = " << m_Age << endl;
}
int m_Age;
};
int main()
{
Derive derive;
derive.m_Age = 10;
derive.showAge();
// 1.通过对象访问
derive.Base::m_Age = 20;
derive.Base::showAge();
// 2.通过类名访问
Derive::Base::m_Age = 30;
Derive::Base::showAge();
return 0;
}