首先 我们得理解一些概念
基类(Base Class):
- 基类是创建一个或多个派生类的原始类。
- 它定义了派生类将继承的属性和方法。
- 基类通常包含虚函数,这样可以在派生类中重写它们。
- 基类还包含纯虚函数,这要求任何派生类都实现它们。
派生类(Derived Class):
- 派生类是从基类派生出来的类。
- 它继承了基类的所有公有和保护成员。
- 派生类可以添加新的属性和方法,或者覆盖基类的函数。
- 派生类可以改变继承的行为,通过重写基类的虚函数。
基类和派生类的区别:
1)继承方式:基类是创建派生类的模板,而派生类是从这个模板继承而来的具体类。
2)功能扩展:派生类可以添加新的功能,或者覆盖基类的功能以改变其行为。
3)代码重用:通过继承,派生类可以重用基类的代码,减少代码冗余。
4)多态性:通过继承和虚函数,可以实现多态性,即一个接口可以有多种实现方式。
5)访问修饰符:在C++中,派生类可以访问基类的公有和保护成员,但不能访问其私有成员。
6)构造函数和析构函数:在C++中,基类的构造函数和析构函数会被自动调用,不需要显式地在派生类中调用。
7)多重继承:C++支持多重继承,即一个类可以从多个基类继承。这可以带来一些复杂性,但也可以帮助解决一些设计问题。
C++中的继承是一种机制,允许一个类(派生类)继承另一个类(基类)的成员变量和成员函数。通过继承,派生类可以重用基类的代码,并且可以在此基础上添加或覆盖基类的功能。
继承可以分为公有继承、保护继承和私有继承三种方式。公有继承是最常用的继承方式,它表示派生类可以访问基类的公有和保护成员。保护继承表示派生类只能访问基类的保护成员,而私有继承表示派生类只能访问基类的私有成员。
在C++中,派生类可以继承基类的所有公有和保护成员,但不能继承其私有成员。派生类还可以添加新的成员变量和成员函数,或者覆盖基类的函数以改变其行为。
通过继承,可以实现代码重用和多态性。代码重用是指派生类可以重用基类的代码,避免重复编写相同的代码。多态性是指一个接口可以有多种实现方式,即可以通过基类的指针或引用来调用派生类的方法,从而实现动态绑定。
需要注意的是,继承也有一些潜在的问题,如虚函数表的使用和维护、构造函数和析构函数的调用顺序等。此外,多重继承也可能带来一些复杂性,需要谨慎使用。C++ 支持多重继承,即一个类可以继承自多个基类。此外,C++ 还支持虚拟继承。下面分别举例说明。
1,在 C++ 中,继承可以通过使用 :
或 extends
关键字来实现。下面是一个单继承简单的例子:
#include <iostream>
// 基类
class Animal {
public:
void eat() {
std::cout << "The animal eats." << std::endl;
}
};
// 派生类
class Dog : public Animal {
public:
void bark() {
std::cout << "The dog barks." << std::endl;
}
};
int main() {
Dog myDog;
myDog.eat(); // 调用基类的函数
myDog.bark(); // 调用派生类的函数
return 0;
}
在上面的例子中,Dog
类继承了 Animal
类。这意味着 Dog
类可以访问 Animal
类的所有公有和保护成员。在这个例子中,Dog
类重写了 eat
方法,并添加了一个新的方法 bark
。在 main
函数中,我们创建了一个 Dog
对象 myDog
,并调用了它的 eat
和 bark
方法。
2,以下是一个C++多重继承的示例:
#include <iostream>
// 基类 A
class A {
public:
void showA() {
std::cout << "Class A" << std::endl;
}
};
// 基类 B
class B {
public:
void showB() {
std::cout << "Class B" << std::endl;
}
};
// 基类 C,继承自 A 和 B
class C : public A, public B {
public:
void showC() {
std::cout << "Class C" << std::endl;
}
};
int main() {
C c;
c.showA(); // 调用基类 A 的方法
c.showB(); // 调用基类 B 的方法
c.showC(); // 调用派生类 C 的方法
return 0;
}
在上面的示例中,类 C 继承自类 A 和类 B,因此它可以访问类 A 和类 B 的公有成员。在主函数中,我们创建了一个类 C 的对象 c,并调用了它的方法。通过多重继承,我们可以实现代码重用和多态性,提高代码的可维护性和可重用性。
3,以下是一个C++虚拟继承的示例:
#include <iostream>
// 基类 A
class A {
public:
void showA() {
std::cout << "Class A" << std::endl;
}
};
// 基类 B
class B {
public:
void showB() {
std::cout << "Class B" << std::endl;
}
};
// 派生类 C,继承自 A 和 B
class C : virtual public A, virtual public B {
public:
void showC() {
std::cout << "Class C" << std::endl;
}
};
int main() {
C c;
c.showA(); // 调用基类 A 的方法
c.showB(); // 调用基类 B 的方法
c.showC(); // 调用派生类 C 的方法
return 0;
}
在上面的示例中,类 C 使用了虚拟继承来继承类 A 和类 B。虚拟继承可以消除虚基类在派生类中的重复实例化,从而解决菱形问题。在主函数中,我们创建了一个类 C 的对象 c,并调用了它的方法。通过虚拟继承,我们可以实现代码重用和多态性,提高代码的可维护性和可重用性。