📅  最后修改于: 2023-12-03 15:29:55.601000             🧑  作者: Mango
继承是面向对象编程中的一个重要概念,它使得一个类可以从另一个类中继承属性和方法。在 C++ 中,通过关键字 class
或 struct
定义的类也可以继承另一个类的成员。
class BaseClass {
// 基类成员
};
class DerivedClass : [访问修饰符] BaseClass {
// 派生类成员
};
其中,DerivedClass
是派生类,BaseClass
是基类。
[访问修饰符]
指定派生类访问基类成员的权限,可以是 public
、protected
或 private
,默认为 private
。
派生类可以访问基类的 public
和 protected
成员,但不能直接访问基类的 private
成员。
派生类的构造函数和析构函数可以调用基类的构造函数和析构函数。
class BaseClass {
public:
BaseClass();
virtual ~BaseClass();
};
class DerivedClass : public BaseClass {
public:
DerivedClass() : BaseClass() {} // 调用基类无参构造函数
virtual ~DerivedClass() {}
};
派生类的构造函数必须先调用基类的构造函数,再进行自己的初始化。
在基类的析构函数前加上关键字 virtual
,可以使得通过基类指针来删除指向派生类的对象时,派生类的析构函数也被调用,从而避免内存泄漏。
C++ 支持一个派生类继承多个基类,这称为多重继承。多重继承可以将多个不同的基类组合成一个派生类。
class Base1 {
// 基类 1 的成员
};
class Base2 {
// 基类 2 的成员
};
class DerivedClass : [访问修饰符] BaseClass1, [访问修饰符] BaseClass2 {
// 派生类成员
};
虚继承允许在派生类继承多个基类时,避免产生多个相同的基类对象。
class BaseClass {
// 基类成员
};
class Derived1 : public virtual BaseClass {
// 派生类 1 的成员
};
class Derived2 : public virtual BaseClass {
// 派生类 2 的成员
};
class Derived : public Derived1, public Derived2 {
// 派生类成员
};
使用 virtual
关键字继承基类,可以将 Derived1
和 Derived2
中的 BaseClass
合并成一个虚基类,从而避免在 Derived
中有多个 BaseClass
对象的问题。
虚函数允许派生类重新定义基类的成员函数,从而实现多态性。在基类中定义一个虚函数,在派生类中重新定义该函数,就是覆盖(override)。
class BaseClass {
public:
virtual void print() {
std::cout << "BaseClass" << std::endl;
}
};
class DerivedClass : public BaseClass {
public:
virtual void print() {
std::cout << "DerivedClass" << std::endl;
}
};
int main() {
BaseClass* b = new DerivedClass();
b->print(); // 输出 DerivedClass
delete b;
return 0;
}
定义虚函数需要使用关键字 virtual
,成员函数的声明和定义都需要加上 virtual
,而在派生类中覆盖时,只需要在函数声明和定义中加上 virtual
,不需要再加上 override
。