继承
public继承
父类 pubilc 子类 public
protected protected
private private
protected继承父类 pubilc 子类 protected
protected protected
private private
private继承父类 pubilc 子类 private
protected private
private private
构造和析构的顺序
先构造父类,再构造子类
先析构子类,再析构父类
先生爸爸,再生儿子
儿子先走,爸爸再走
同名成员处理方式
总结:
- 子类对象可以直接访问到子类中同名成员
- 子类对象加作用域可以访问到父类同名成员
- 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类同名函数。
class Base
{
public:
Base()
{
m_A = 100;
}
void func()
{
cout << "父类同名成员函数调用" << endl;
}
void func(int a)
{
cout << "父类同名重载成员函数调用" << endl;
}
int m_A;
};
class Son:public Base
{
public:
Son()
{
m_A = 200;
}
void func()
{
cout << "子类同名成员函数调用" << endl;
}
int m_A;
};
//同名成员属性处理方式
void test01()
{
Son son;
cout <<son.m_A<< endl;
//如果要通过子类对象访问到父类中的同名成员,需要加作用域。
cout <<son.Base::m_A<< endl;
}
//同名成员函数处理方式
void test02()
{
Son son1;
son1.func();//子
son1.Base::func();//父
//如果子类中出现和父类同名的成员函数
//子类的同名成员会隐藏掉父类中所有同名成员函数
//如果想要访问到父类中被隐藏的同名成员函数,需要加作用域
son1.Base::func(10);
}
静态成员处理方式
class Base
{
public:
static void func();
static void func(int a);
static int m_A;
};
int Base::m_A = 100;
class Son :public Base
{
public:
static void func();
static int m_A;
};
int Son::m_A = 200;
//同名静态成员
void test()
{
//通过对象访问
Son son1;
cout << "通过对象访问" << endl;
cout << son1.m_A << endl;
cout << son1.Base::m_A << endl;
//通过类名访问
cout << "通过类名访问" << endl;
cout << Son::m_A << endl;
//第一个::代表通过类名方式访问,第二个::代表访问父类作用域下
cout << Son::Base::m_A << endl;
}
//同名静态函数
void test01()
{
//通过对象访问
Son son2;
cout << "通过对象访问" << endl;
son2.func();
son2.Base::func();
//通过类名访问
cout << "通过类名访问" << endl;
Son::func();
Son::Base::func();
Son::Base::func(100);
}
通过类名访问基类成员
Son::Base::m_Age;
通过对象访问基类成员
Son a;
a.Base::m_Age;
菱形继承
class Sheep:virtual public Animal
{
};//虚继承来解决这个问题