继承(上):【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣-CSDN博客
继承(下):【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘-CSDN博客
前言:
目录
一、单继承和多继承
C++单继承
单继承的语法如下:
class Base {
public:
void baseFunction() {
cout << "Base function" << endl;
}
};
class Derived : public Base {
public:
void derivedFunction() {
cout << "Derived function" << endl;
}
};
在这个例子中,Derived 类继承自 Base 类。Derived 类可以访问 Base 类中声明为 public 的成员。
C++多继承
多继承的语法如下:
class Base1 {
public:
void base1Function() {
cout << "Base1 function" << endl;
}
};
class Base2 {
public:
void base2Function() {
cout << "Base2 function" << endl;
}
};
class Derived : public Base1, public Base2 {
public:
void derivedFunction() {
cout << "Derived function" << endl;
}
};
在这个例子中,Derived 类同时继承自 Base1 和 Base2。Derived 类可以访问两个基类中声明为 public 的成员。
多继承的复杂性
二、菱形继承
问题1:冗余性
问题2:二义性
下面来看一个例子:
class Person
{
public :
string _name ; // 姓名
};
class Student : public Person
{
protected :
int _num ; //学号
};
class Teacher : public Person
{
protected :
int _id ; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ; // 主修课程
};
void Test ()
{
// 这样会有二义性无法明确知道访问的是哪一个
Assistant a ;
a._name = "peter";
// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决
a.Student::_name = "xxx";
a.Teacher::_name = "yyy";
}
下面我们来讲解一种解决上面问题的方法——虚拟继承
三、虚拟继承
虚继承是一种特殊的继承方式,用于解决菱形继承中的冗余性和二义性问题。了解虚继承的相关知识点有助于更好地使用它。
虚基类:在虚继承中,被继承的类被称为虚基类。
虚基类的成员变量和成员函数在子类中只会存在一份,避免了冗余性问题。
虚继承的基本语法如下:
class BaseClass {
public:
int var;
};
class LeftChild : public virtual BaseClass {
public:
// ...
};
class RightChild : public virtual BaseClass {
public:
// ...
};
class FinalChild : public LeftChild, public RightChild {
public:
// ...
};
在上面的示例中,LeftChild 和 RightChild 都virtually继承自 BaseClass,这样在 FinalChild 继承 LeftChild 和 RightChild 时,就不会再继承 BaseClass 的两份副本,避免了冗余性问题。此时,BaseClass 的成员变量 var 在 FinalChild 中只有一份,并且不会发生二义性问题。
总之,C++ 通过虚继承解决了菱形继承中的冗余性和二义性问题,使得在使用继承时更加灵活和安全。
四、总结
感谢各位大佬观看,创作不易,还请各位大佬点赞支持一下!!!