这里我就来详细讲解一下“代码讲解C++继承和派生”的完整攻略。
1. C++继承
C++中的继承是指从一个类中派生出另一个类,具体实现方式为在派生类的定义中使用“:”后面跟上基类的名称。
1.1 基类和派生类的定义
下面是一个基类的定义:
class Shape {
public:
virtual void draw() = 0;
virtual double area() = 0;
}
这里定义了一个图形类Shape,其中包含两个纯虚函数,分别为draw和area。这两个函数在派生类中必须被实现。
下面是一个派生类的定义:
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() override {
cout << "Drawing circle ..." << endl;
}
double area() override {
return 3.14 * radius * radius;
}
}
这里定义了一个圆形类Circle,它从基类Shape中继承了两个纯虚函数draw和area,并且实现了它们。在派生类的定义中,使用“:”后面跟上基类的名称来继承基类。
1.2 继承类型和访问控制
在C++中,派生类可以选择不同的继承类型,包括public、private和protected。
对于public继承,基类中所有的public成员都会成为派生类中的public成员,所有的protected成员都会成为派生类中的protected成员,所有的private成员都不可见。
对于private继承,基类中所有的public和protected成员都变成了派生类的private成员,所有的private成员都不可见。
对于protected继承,基类中所有的public和protected成员都变成了派生类的protected成员,所有的private成员都不可见。
1.3 多重继承
C++还支持多重继承,即从多个基类中派生出一个派生类。多重继承的定义方式与单一继承类似,在派生类的定义中使用“:”后面跟上多个基类的名称,用逗号隔开。
下面是一个多重继承的示例:
class BaseOne {
public:
void methodOne() {
cout << "BaseOne::methodOne()" << endl;
}
};
class BaseTwo {
public:
void methodTwo() {
cout << "BaseTwo::methodTwo()" << endl;
}
};
class Derived : public BaseOne, public BaseTwo {
public:
void method() {
methodOne();
methodTwo();
}
};
这里定义了两个基类BaseOne和BaseTwo,以及一个派生类Derived,派生类从这两个基类中继承了它们的所有公共成员函数。在定义派生类Derived时,使用多个基类的名称,用逗号隔开。
2. C++派生
在C++中,从已有的类中派生出新的类称为派生。派生可以实现代码的复用,提高代码的可读性。
2.1 派生的方式
C++中有三种派生方式,分别为public、protected和private。不同的派生方式对派生类中的成员的访问权限不同。
对于public派生,原来基类中的public成员在派生类中仍然是public成员,原来基类中的protected成员在派生类中变成了protected成员,原来基类中的private成员在派生类中仍然是不可见的。
对于protected派生,原来基类中的public和protected成员在派生类中变成了protected成员,原来基类中的private成员在派生类中仍然是不可见的。
对于private派生,原来基类中的public和protected成员在派生类中变成了private成员,原来基类中的private成员在派生类中仍然是不可见的。
2.2 派生的实现
派生是通过派生类的定义来实现的,派生类的定义需要指明要从哪个基类派生出来,同时还可以在派生类中添加新的成员变量和成员函数。
下面是一个派生类的示例:
class Base {
public:
int num;
};
class Derived : public Base {
public:
int num2;
void print() {
cout << num << " " << num2 << endl;
}
};
这里定义了一个基类Base和一个派生类Derived。在Derived类的定义中,使用“:”后面跟上public和基类名称Base,表示从Base类中public继承。Derived类还添加了一个新成员变量num2和一个成员函数print。
2.3 虚继承
虚继承和普通继承的区别在于,在继承链中存在共同的基类时,虚继承可以避免产生冗余的成员变量和函数,从而节省内存。
在C++中,使用关键字virtual来进行虚继承。
下面是一个虚继承的示例:
class Base {
public:
int num;
};
class Derived : virtual public Base {
public:
int num2;
};
class Derived2 : virtual public Base {
public:
int num3;
};
class Derived3 : public Derived, public Derived2 {
public:
void print() {
cout << num << " " << num2 << " " << num3 << endl;
}
};
这里定义了 Base、Derived、Derived2 和 Derived3 四个类。其中,Base是一个基类,Derived 和 Derived2 都是虚继承 Base,而 Derived3 则同时继承了 Derived 和 Derived2。
虚继承通常用于解决菱形继承问题,即某个类同时从两个派生类中继承相同的成员变量和函数。虚继承会让这个类只继承其中一个派生类的成员,从而避免了冗余的成员继承。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:代码讲解C++继承和派生 - Python技术站