C++中的继承与多继承

一个类有多个直接基类被称为是多继承

public的继承方式

基类中所有public成员在派生类中为public属性

基类中所有protected成员在派生类中为protected属性

基类中所有private成员在派生类及其他类中不能访问

protected的继承方式

基类中所有public成员在派生类中为protected属性

基类中所有protected成员在派生类中为protected属性

基类中所有private成员在派生类及其他类中不能访问

private的继承方式

基类中所有public成员在派生类中为private属性

基类中所有protected成员在派生类中为private属性

基类中所有private成员在派生类及其他类中不能访问

#include<iostream>
using namespace std;
class A
{
private:
	int m_a;
protected:
	int m_b;
public:
	int m_c;
public:
	void print1()
	{
		cout << m_a << endl;
		cout << m_b << endl;
		cout << m_c << endl;
	}
};
class B : public A
{
//public:
	//int m_c;
//protected:
	//int m_b;   //继承来的。
public:
	void print2()
	{
		cout << m_c << endl;
		cout << m_b << endl;
	}
};
class C : protected A
{
//protected:
	//int m_c;
//protected:
	//int m_b;
public:
	void print3()
	{
		cout << m_c << endl;
		cout << m_b << endl;
	}
};
class D : private A
{
//private:
	//int m_b;
//private:
	//int m_c;
public:
	void print4()
	{
		cout << m_c << endl;
		cout << m_b << endl;
	}
};
int main()
{
	A a;
	//a.m_a;    //a 为私有成员,只有本身类可以访问,不能被其他类或派生类访问。
	//a.m_b;    //b 为受保护成员,只能被基类和派生类访问,不能被其他类访问。
	a.m_c;
	B b;
	//b.m_a;
	//b.m_b;
	b.m_c;
	C c;
	//c.m_a;
	//c.m_b;
	//c.m_c;
	return 0;
}

多继承中构造顺序与继承顺序有关,与初始化列表无关。

#include<iostream>
using namespace std;
class A
{
//private:
public:
	int m_a;
	int x;
	A(int a);
	~A();
};
A::A(int a)
{
	cout << "AAAAAAAAAAA" << endl;
	m_a=a;
}
A::~A()
{
	cout << "aaaaaaaaaaa" << endl;
}
class B
{
//private:
public:
	int m_b;
	int x;
	B(int b);
	~B();
};
B::B(int b)
{
	cout << "BBBBBBBBBBBB" << endl;
	m_b=b;
}
B::~B()
{
	cout << "bbbbbbbbbbbb" << endl;
}
class C : public B, public A    //构造顺序与继承顺序有关
{
//private:
public:
	int m_c;
	C(int c);
	~C();
};
C::C(int c):B(1),A(1)          //多继承,继承顺序与初始化列表无关
{
	cout << "CCCCCCCCCCC" << endl;
	m_c=c;
}
C::~C()
{
	cout << "ccccccccccc" << endl;
}
int main()
{
	C c(1);
	cout << sizeof(c) << endl;
	cout << &c << endl;
	cout << &c.m_b << endl;
	cout << &c.B::x << endl;
	cout << &c.m_a << endl;
	cout << &c.A::x << endl;
	cout << &c.m_c << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/tmh_15195862719/article/details/81265531
今日推荐