继承的概念
在 C++ 中,继承(Inheritance) 是面向对象编程的核心特性之一,它允许一个类(派生类,也称子类)继承另一个类(基类,也称父类)的属性和方法,从而实现代码复用和多态性。
基本方式:
在C++存在三大继承(公有继承,私有继承与保护继承)。
继承的具体实现:
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
// 公有继承
class PublicDerived : public Base {
// publicVar -> public
// protectedVar -> protected
// privateVar -> 不可访问
};
// 私有继承
class PrivateDerived : private Base {
// publicVar -> private
// protectedVar -> private
// privateVar -> 不可访问
};
// 保护继承
class ProtectedDerived : protected Base {
// publicVar -> protected
// protectedVar -> protected
// privateVar -> 不可访问
};
继承方式的影响:
基类成员 |
公有继承(public) |
私有继承(private) |
保护继承(protected) |
public |
仍为 public |
变为 private |
变为 protected |
protected |
仍为 protected |
变为 private |
变为 protected |
private |
不可访问 |
不可访问 |
不可访问 |
构造与析构顺序
构造顺序:先调用基类构造函数,再调用派生类构造函数。
析构顺序:与构造顺序相反,先调用派生类析构函数,再调用基类析构函数。
成员函数的覆盖(override关键字)
在基类中用虚关键字(virtual)修饰的函数,可以在派生类中进行重写。
也可使用override关键字(C++11)保证重写的顺利完成。
class Base {
public:
virtual void print() { // 虚函数
std::cout << "Base::print()" << std::endl;
}
};
class Derived : public Base {
public:
void print() override { // 重写基类的虚函数
std::cout << "Derived::print()" << std::endl;
}
};
// 使用基类指针调用派生类函数(多态)
Base* ptr = new Derived();
ptr->print(); // 输出:Derived::print()
多继承
c++支持一个类从多个基类继承,也支持一个类派生出多个派生类,就可能引发菱形继承的问题
菱形继承的解决措施(虚继承)
让中间层基类(如B和C)以虚继承方式继承基类(A),这样派生类(D)只会保留一份基类的副本