c++ 基础知识-类和对象-继承2

本文详细介绍了C++中继承的概念,包括构造和析构函数的调用顺序,以及如何处理类之间的同名成员。通过实例展示了单一继承、多继承以及菱型继承的情况,并强调了虚继承解决菱型继承问题的方法。此外,还探讨了如何访问同名静态成员。
摘要由CSDN通过智能技术生成

1.c++ 基础知识-类和对象-继承-构造和析构顺序

#include <iostream>  
#include <string>    
using namespace std;
//继承
// 基类 父类 包含一些公共或者说可以重复利用的内容
class Base
{
public:
	Base();
	~Base();
};

Base::Base()
{
	cout<<"Base():构造函数"<<endl;
}
Base::~Base()
{
	cout<<"Base():析构函数"<<endl;
}
//公共继承 public
class A:public Base
{
public:
	A();
	~A();
};
A::A()
{
	cout<<"A():构造函数"<<endl;
}
A::~A()
{
	cout<<"A():析构函数"<<endl;
}
void fun_A()
{
	A a;
}
int main()
{
	fun_A();
	//输出:
	//Base():构造函数
	//A():构造函数
	//A():析构函数
	//Base():析构函数
	return 0;
}  

2.c++ 基础知识-类和对象-继承-同名成员处理

#include <iostream>  
#include <string>  
using namespace std;

//继承
// 基类 父类 包含一些公共或者说可以重复利用的内容
class Base
{
public:
	Base();
	
	void fun();

	void fun(int n);
	int m_A;
};

Base::Base()
{
	m_A = 2000;
}

void Base::fun()
{
	cout<<"Base : fun()"<<endl;
}

void Base::fun(int n)
{
	cout<<"n = "<<n<<endl;
	cout<<"Base:fun(int n)"<<endl;
}

//公共继承 public
class A:public Base
{
public:
	A();
	void fun();
	int m_A;
};

A::A()
{
	m_A = 100;
}
void A::fun()
{
	cout<<"A : fun()"<<endl;
}

void fun_A()
{
	A a;
	cout<<a.m_A<<endl;//默认访问的都是子类成员变量
	cout<<a.Base::m_A<<endl;//访问父类成员变量需要用作用域
	a.fun();//默认访问的都是子类成员函数
	a.Base::fun();//访问父类成员函数需要用作用域
	//a.fun(4);//error C2660: “A::fun”: 函数不接受 1 个参数 //同名函数只能访问子类中的,不是重载
	a.Base::fun(4);//访问父类成员函数需要用作用域
}

int main()
{
	fun_A();
	//输出
	//100
	//2000
	//A : fun()
	//Base : fun()
	//n = 4
	//Base:fun(int n)
	return 0;
}  
注意,同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象和类名)
//例如上述代码中
//Base中有静态成员函数
static void fun();//static 静态成员函数

//A中有静态成员函数
static void fun();//static 静态成员函数

//可以利用下面的两种方式访问
A::Base::fun();//访问父类成员函数需要用作用域  对象
a.Base::fun();//访问父类成员函数需要用作用域   类名

3.c++ 基础知识-类和对象-继承-多继承

#include <iostream>  
#include <string>  
using namespace std;

//继承
// 基类 父类 包含一些公共或者说可以重复利用的内容
class Base
{
public:
	Base();
	int m_A;
};

Base::Base()
{
	m_A = 2000;
}

class Base1
{
public:
	Base1();
	int m_B;
};

Base1::Base1()
{
	m_B = 22222;
}

//公共继承 public
class A:public Base,public Base1//多继承语法
{
public:
	A();
	int m_C;
};
A::A()
{
	m_C = 10000;
}
void fun()
{
	A a;
	cout<<sizeof(a)<<endl;
	cout<<a.m_A<<endl;
	cout<<a.m_B<<endl;
	cout<<a.m_C<<endl;
	//输出
	//12  3*4(int)
	//2000
	//22222
	//10000
}
int main()
{
	fun();
	return 0;
}  

4.c++ 基础知识-类和对象-继承-菱型继承

#include <iostream>  
#include <string>  
using namespace std;

//菱型继承
// 基类 父类 包含一些公共或者说可以重复利用的内容
class Base
{
public:
	Base();
	int m_number;
};

Base::Base()
{
	m_number = 2000;
}
//利用虚继承可以解决菱型继承的问题(继承指针)
//虚继承 继承前加关键字virtual
//虚基类
//class Left : virtual public Base
class Left : virtual public Base
{
};
//class Right : public Base
class Right : virtual public Base
{

};
//公共继承 public
class Test:public Left,public Right
{
};
void fun()
{
	Test t;
	t.Left::m_number = 18;
	t.Right::m_number = 28;
	//菱型继承,变量同名,需要加作用域区分 -多份数据
	//虚继承-只有一份数据
	cout<<t.Left::m_number<<endl;//28
	cout<<t.Right::m_number<<endl;//28
	cout<<t.m_number<<endl;//28

}
int main()
{
	fun();
	return 0;
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值