C++的继承方式

C++支持多种程序设计风格,其中就包括对面向对象设计的支持。我们今天在这里将会为大家详细介绍一下各种C++继承方式的具体应用方法,希望能够帮助大家对这方面的知识有一个深入的认识。

C++继承方式总共分为以下几种:

public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。

(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。

(2)private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。

(3)protected(保护性继承):继承时基类中private成员被隐藏,基类其他中各成员属性均变为protected。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。


既然说到继承方式,那应该说下虚继承,即虚基类

        在一个复杂的系统中,类的继承中不免会出现多重继承的方式,比较常见的就如下面的菱形继承

                                                         B

                                                   /             \

                                             D1                D 2

                                                 \                /

                                                        A

                      

          当某个类的部分或者全部直接基类是从另一个共同基类派生而来时,在这些直接基类中会拥有从上一级的共同基类继承过来的相同名称的成员,在派生类中,这些相同成员拥有多个拷贝,而且同一个函数名会有多个映射,我们可以在使用继承类时通过作用域“::”分辨符来唯一标识并访问他们,但是这样使用既造成内存浪费,使用起来也比较麻烦容易弄错。因此,虚基类出场了。

         将共同基类设置为虚基类,从不同路径继承过来的同名数据成员在内存中只有一份拷贝,并且同一个函数名只有一个映射,在使用时直接调用即可。

        虚基类的声明是在派生类的定义过程中进行的

      class 派生类名:virtual 继承方式 基类名A                              --------这样A就变成了虚基类了


虚基类和派生类的构造函数

        如果虚基类的构造函数式默认的,则其派生类不需要对其初始化,如果虚基类的构造函数非默认的,即有参数,而且没有声明默认形式下的构造函数,那么在整个的继承关系中,直接或者间接继承虚基类的所有派生类,都必须在构造函数的成员初始化列表中列出对虚基类的初始化。


下面是代码

#include <iostream>
using namespace std;

class Base
{
public:
	Base(int i_v)
	{
		m_v = i_v;
	}

	void Show() 
	{
		cout<<m_v<<endl;
	}

public:
	int m_v;
};

class Devid1:virtual public Base
{
public:
	Devid1(int i_v): Base(i_v){}
};

class Devid2:virtual public Base
{
public:
	Devid2(int i_v): Base(i_v){}
};

class A:public Devid1, public Devid2
{
public:
	A(int i_v): Base(i_v), Devid1(i_v), Devid2(i_v){}
};

void main()
{
	A *a = new A(3);
	a->Show();

	a->m_v = 6;
	a->Show();

	delete a;
	system("pause");

}

A类继承了两次的Base类的成员,但是调用没有冲突,这就是因为虚继承的作用。

运行结果如下


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值