# day-08 继承2.0

同名成员及同名静态成员的处理方式

问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据?

1.访问子类同名成员 直接访问即可
2. 访问父类同名成员 需要加作用域
3. 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数

通过对象访问:

	Son s;
	cout << "Son  下 m_A = " << s.m_A << endl;//直接访问
	cout << "Base 下 m_A = " << s.Base::m_A << endl;//加作用域

通过类名访问:

class Son : public Base {
    
    
public:
	static void func()
	{
    
    
		cout << "Son - static void func()" << endl;
	}
	static int m_A;
};


	cout << "Son  下 m_A = " << Son::m_A << endl;
	cout << "Base 下 m_A = " << Son::Base::m_A << endl;

回顾:

1、::是域运算符
一、
如果在局部有一个变量n,还有一个全局变量n,即两个同名,你要想访问全局的就要写::n,写n就是局部变量.

二、作用域符号”::“的前面一般是类名称,后面一般是该类的成员名称,C++为例避免不同的类有名称相同的成员而采用作用域的方式进行区分。

eg:
A,B表示两个类,在A,B中都有成员member
1、A::member就表示类A中的成员member
2、B::member就表示类B中的成员member

2、静态变量
静态变量在类内声明,类外初始化
静态变量的初始化,只能在类外进行,静态变量在类外初始化要加上::,同时不能加上static 关键字

class Base {
    
    
public:
	static void func()
	{
    
    
		cout << "Base - static void func()" << endl;
	}
	static void func(int a)
	{
    
    
		cout << "Base - static void func(int a)" << endl;
	}

	static int m_A;
};

int Base::m_A = 100;

class Son : public Base {
    
    
public:
	static void func()
	{
    
    
		cout << "Son - static void func()" << endl;
	}
	static int m_A;
};

int Son::m_A = 200;

多继承

通俗的讲,就是一个儿子认多个爹的意思

语法:class 子类 :继承方式 父类1 , 继承方式 父类2…
class Son:public Base1,protected Base2;

多继承可能会引发父类中有同名成员出现,需要加作用域区分

	cout << s.Base1::m_A << endl;
	cout << s.Base2::m_A << endl;

C++实际开发中不建议用多继承

菱形继承问题以及解决方法

菱形继承的主要问题

子类继承两份相同的数据,导致资源浪费以及毫无意义

利用虚继承可以解决菱形继承问题

继承前加virtual关键字后,变为虚继承

class Sheep : virtual public Animal {
    
    };
class Tuo   : virtual public Animal {
    
    };
class SheepTuo : public Sheep, public Tuo {
    
    };

此时公共的父类Animal称为虚基类

猜你喜欢

转载自blog.csdn.net/weixin_48245161/article/details/113249092