25、继承语法:class 子类(派生类):public(继承方式) 父类(基类)。继承方式有公共继承、保护继承、私有继承三种。
26、父类中所有非静态的成员属性都会被继承下去,父类中私有的成员属性是被编译器隐藏了虽然访问不到但是会继承下去。可以用开发人员命令提示工具查看对象模型,先跳转到具体路径下,cl /d1 reportSingleClassLayout类名 文件名。
27、构造和析构的顺序,先构造父类再构造子类,析构与构造相反。
28、继承中,同名成员问题。子类对象可以直接访问到子类中的同名成员。子类对象加作用域可以访问父类同名成员。当子类与父类拥有同名的成员函数,子类会隐藏父类中的同名成员函数,加作用域可以调用。
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
m_A = 100;
}
void func()
{
cout << "Base下的成员函数" << endl;
}
void func(int a)
{
cout << "Base下的成员函数(int a)" << endl;
}
int m_A;
};
class Son :public Base
{
public:
Son()
{
m_A = 200;
}
void func()
{
cout << "Son下的成员函数" << endl;
}
int m_A;
};
//同名成员属性
void test01()
{
Son s;
cout << "Son 下m_A= " << s.m_A << endl;
//如果通过子类对象访问到父类中的同名成员,需要加作用域
cout << "Base 下m_A= " << s.Base::m_A << endl;
}
//同名成员函数
void test02()
{
Son s;
s.func();
s.Base::func();
//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
//如果想访问到父类中被隐藏的同名成员函数,需要加作用域。
s.Base::func(100);
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
29、静态同名成员访问同28,只是除了通过对象访问还可以通过类名来访问。
30、继承多个类的语法。class 子类:继承方式 父类1,继承方式 父类2...在实际应用中,不建议使用多继承。当父类中出现同名成员,需要加作用域以区分。
31、菱形继承(钻石继承)。两个派生类同时继承一个基类,又有个类D同时继承两个派生类。产生问题:(1)两个派生类同时继承基类数据,类D使用数据时会产生二义性;(2)类D继承了两份基类数据,其实只需要一份。
解决方法:(1)添加不同作用域(2)使用虚继承。在继承前加上virtual关键字。class XXX: virtual public XXX。虚继承并不是继承的数据,而是继承的一个指针,通过指针偏移量找到唯一数据,使得数据只有一份。