📜  C++继承(1)

📅  最后修改于: 2023-12-03 15:29:55.601000             🧑  作者: Mango

C++ 继承

继承是面向对象编程中的一个重要概念,它使得一个类可以从另一个类中继承属性和方法。在 C++ 中,通过关键字 classstruct 定义的类也可以继承另一个类的成员。

基本语法
class BaseClass {
    // 基类成员
};

class DerivedClass : [访问修饰符] BaseClass {
    // 派生类成员
};

其中,DerivedClass 是派生类,BaseClass 是基类。

[访问修饰符] 指定派生类访问基类成员的权限,可以是 publicprotectedprivate,默认为 private

派生类可以访问基类的 publicprotected 成员,但不能直接访问基类的 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 关键字继承基类,可以将 Derived1Derived2 中的 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