C++——继承

本文深入探讨了面向对象编程中的继承机制,包括公有、私有和保护继承的差异,以及如何处理重名成员和成员函数。通过实例展示了多继承的实现,并解释了虚继承的重要性,以确保基类的唯一性。此外,还提到了基类构造函数的执行顺序和析构顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

继承机制使用已经定义的类作为基础建立新的类的定义,新的类是原有类的数据及操作新类所增加的数据及操作的组合。新的类把原有的类作为基类引用,而不需要修改原来的类的定义。

继承格式

class默认访问控制为private

class 派生类名:访问控制 基类名表
{
	数据成员和成员函数的说明
};

继承方式

方式说明
公有继承访问权限不变
私有继承访问权限变为私有
保护继承访问权限变为保护

重名成员

#include<iostream>
using namespace std;
class Base{	
	public:
		int a,b;
};
class Derived:public Base{
	public b,c;
};
int main(){
	Derived d;
	d.a=1;
	d.Base::b=2;//显示指明是哪个类型的b
	d.b=3;
	d.c=4;
}

重名成员函数

#include<iostream>
using namespace std;
class A{
	public:
		int a1,a2;
		A(int i1=0,int i2=0){
			a1=i1;
			a2=i2;
		}
		void print()
		{	cout<"a1="<<a1<<'\t'<<"a2="<<a2<<endl;	}
};
class B:public A{
	publicint b1,b2;
	B(int j1=1,int j2=1){
		b1=j1;
		b2=j2;
	}
	void print()//定义同名函数
	{	cout<<"b1="<<a1<<'\t'<<"a2="<<a2<<endl;}
	void printAB(){
		A::print();//显示指明为A类的print
		print();
};
	

注意

  1. 先创建基类,再创建派生类;
  2. 先析构派生类,再析构基类;

多继承

  1. 定义:一个派生类从多个基类派生处理,称为多继承。
  2. 基类构造函数的执行顺序取决与定义派生类时指定各个继承基类的顺序。
class Base1{
	public:
		Base1(int x)
		{	value=x;	}
		int getData()const
		{	return value;	}
	protected:
		int value;
}

class Base2{
	public:
		Base2(char c)
		{	letter=c;	}
		char getData()const
		{	return letter;	}
		protected:
			char letter;
};

class Derived:public Base1, public Base2{
	friend ostream & operater<<(ostream output, const Derived &);
	public:
		Derived(int,char,double);
		double getReal()const;
	private:
		double real;
};
Derived::Derived(int i,char c,double f):Base1(i),Base2(c),real(f){}
double Derived::getReal()const
{	return real;	}
ostream & operator<<(ostream & output,const Derived & d){
	output<<d.value<<d.letter<<d.real<<endl;
	return output;
}

虚继承

定义:一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类;虚继承即保证多次成为间接基类的数据 函数,只有一个版本

  1. 非虚继承
class B{public:int b;};
class B1:public B{ public:int b1;};
class B2:public B{public:int b2;};
class D:public B1,public B2{public:int d;};

void test(){//有两个不同类的b
	D dd;
	dd.B1::b=5;
	dd.B2::b=10;
	dd.b1=25;
	dd.b2=100;
	dd.d=140;
}
  1. 虚继承
class B{public:int b;};
class B1:virtual public B{public:int b1;};
class B2:virtual public B{public:int b2;};
class D:public B1,pulicB2{public:int d;}

void test(){//只有一个版本的基类B的b
	D dd;
	dd.b=100;
	dd.b1=90;
	dd.b2=80;
	dd.d=70;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值