C++继承

本文详细介绍了C++中的类继承概念,包括不同类型的继承(公有、保护和私有)、友元关系、派生类的初始化以及多继承和菱形继承中的问题及解决方案,重点讲解了虚拟继承以避免数据冗余。

一、什么是C++的继承

        C++的类继承是面向对象思想编程重要的部分,它指的是一个新类可以在老类的基础上进行定义,这里我们称老类为“基类”或“父类”,称新类为“子类”或“派生类”。这样做可以更好地减少我们的工作量,也可以使得类与类之间的逻辑关系更加清晰。

二、书写格式

class 派生类名称 : 继承类型 基类名称{
    ...
}

三、继承类型

        C++继承类型包括三种:public公有类型、protected保护类型、private私有类型

        类的默认继承类型为private私有类型

3.1 public公有类型

        当继承类型为public时,派生类可以继承并使用基类所有public或protected类型的变量

当然,public变量在对象实例化后类内部都可以使用,而protected变量仅能在类内使用

 一般程序中,都采用public作为继承类型。下面给出一个继承的实例:

#include <iostream>
#include <string>

using namespace std;

class Animal {
	protected : 
		string type;
		string sound;
	
	public :
		string testSign; //用于测试成员变量是否能正常调用
		
		Animal(string type, string sound) : type(type), sound(sound) {
			testPrivate = "被赋初值";
		}
}; 

class Dog : public Animal {
	public :
		Dog(string type, string sound) : Animal(type, sound) {}

};

        此时,在主函数实例化一个“Dog”对象,并输出它的testSign成员内容。

        它的内容为“被赋初值”,是可以访问的。

3.2 protected保护类型

        protected作为继承类型时,派生类所继承的成员变量仅能在派生类内部它的派生类使用,但无法在派生类对象实例化时候使用

3.3 private私有类型

        private作为继承类型时,比protected更具有局限性。派生类所继承的成员变量仅能在派生类内部使用,但无法在派生类对象实例化它的派生类中时候使用

四、继承与友元

        C++的友元关系是不会被继承的。

        举例来说:假设C函数是A类的友元函数,B是A的一个派生类,那么未声明的情况下,C函数并不是B类的友元函数。

五、派生类的继承成员初始化

        派生类从基类那里继承了一些成员,这些成员必须在构造方法中通过调用基类的构造方法进行初始化。书写规范如下:

class 继承类名 : public 基类名 {
	public :
		继承类名(参数1, 参数2, ...) : 基类名(参数1, 参数2, ...) {}

    ... ...
};

        下边是一个示例:

class Animal {
	protected : 
		string type;
		string sound;
}; 

class Dog : public Animal {
	public :
		Dog(string t, string s) :Animal(t, s) {}

};

        Animal类存在一个二参数的构造方法,Dog的构造方法通过调用这个Animal的二参构造方法从而完成对变量type与sound的初始化。

六、多继承

        多继承指的是一个类拥有两个及以上个基类,书写格式如下:

class 派生类名称 : 继承类型1 基类1名称, 继承类型2 基类2名称{
    ...
}

七、菱形继承

        菱形继承文字描述比较复杂,我画了一张比较形象的图:

7.1 基类成员的二义性

        在这种的菱形继承关系中,如果Man和Woman都有一个成员叫做age,那么Worker在使用继承的age成员时,他可能不清楚到底是哪一个,会导致程序的二义性(不确定性) 。

        解决办法:需要在使用时前边加上域运算符,指明是来自哪一个基类的成员,如下所示:

Woman::age
Man::age

7.2 虚拟继承

        Man和Woman分别从Person中继承了一份 一模一样的成员,那么这两份成员产生了数据冗余的问题。

        解决办法:采用虚拟继承的方式。采用虚拟继承的方式,可以让菱形继承中间的继承类共享一份基类的继承成员,它用virtual关键字修饰,编写方式如下:

class Person {
    public :
        int age;

        Person(int num) : age(num) {};
}

class Man : virtual public Person {
    public :
        Man(int n) : Person(n) {};
}

class Woman : virtual public Person {
    public :
        Woman(int n) : Person(n) {};
}

class Worker : public Man, Woman {
    public :
        Worker(int n) : Man(n) {};
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值