一、什么是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) {};
}
本文详细介绍了C++中的类继承概念,包括不同类型的继承(公有、保护和私有)、友元关系、派生类的初始化以及多继承和菱形继承中的问题及解决方案,重点讲解了虚拟继承以避免数据冗余。
2158

被折叠的 条评论
为什么被折叠?



