📜  C++中的基类和派生类之间的区别(1)

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

C++中的基类和派生类之间的区别

在面向对象的程序设计中,基类和派生类是重要的概念。基类是派生类的父类,派生类继承了基类的所有成员,同时也可以添加自己的成员。

基类和派生类的定义

在C++中,定义基类可以使用class或struct关键字,如下:

class Base {
public:
    int a;
    void func() {
        // some code here
    }
};

派生类可以通过继承基类来定义,使用冒号后接基类名,如下:

class Derived : Base {
public:
    int b;
    void foo() {
        // some code here
    }
};

注意,这里使用了public关键字来指定继承基类后的访问权限。还有一些其他的关键字,如private和protected,表示派生类对基类的继承权限不同。这里我们简单介绍public关键字的用法。

基类和派生类的区别
1. 成员变量和成员函数

派生类继承了基类的所有成员变量和成员函数,而且派生类可以定义自己的成员变量和成员函数。

例如,上面的Derived类继承了Base类的a变量和func()函数,同时定义了自己的b变量和foo()函数。

2. 继承关系

派生类是基类的扩展,也可以说是基类的一个特殊情况。因此,可以使用指向派生类对象的指针来访问基类成员,但是反之不行。

例如:

Base* p = &d;
int x = p->a;   // 正确,访问Base类的a成员
int y = p->b;   // 错误,Derived类独有的成员不能通过Base类对象访问
3. 构造函数和析构函数

派生类在创建对象时会调用基类的构造函数,以初始化基类的成员变量。派生类也可以定义自己的构造函数和析构函数,以初始化和清理自己的成员变量。

例如:

class Derived : Base {
public:
    int b;
    Derived(int _a, int _b) : Base(_a), b(_b) {
        // some code here
    }
    ~Derived() {
        // some code here
    }
};

这里的构造函数和析构函数分别初始化和清理Derived类的成员变量b。

4. 多态性

基类和派生类之间还有一个重要的概念,叫做多态性。这个概念非常复杂,这里我们简单介绍一下。

多态性是指,在面向对象的程序设计中,父类指针可以指向子类对象,并且根据具体的类型,调用对应的函数。这是面向对象的程序设计中最具有灵活性和扩展性的特征之一。

例如:

class Base {
public:
    virtual void func() {
        // some code here
    }
};

class Derived : Base {
public:
    void func() override {
        // some code here
    }
};

void doSomething(Base* p) {
    p->func();  // 多态调用
}

int main() {
    Base* p1 = new Base();
    Base* p2 = new Derived();
    doSomething(p1);    // 调用Base类的func()函数
    doSomething(p2);    // 调用Derived类的func()函数
    delete p1;
    delete p2;
    return 0;
}

这里我们使用了虚函数和多态性来实现了父类指针指向子类对象,并且根据具体的类型,调用对应的函数。这是面向对象的程序设计中最具有灵活性和扩展性的特征之一。

总结

基类和派生类是面向对象程序设计中非常重要的概念。它们之间的关系非常紧密,派生类可以继承基类的成员变量和成员函数,同时也可以添加自己的成员变量和成员函数。此外,基类和派生类之间还有一些区别,比如继承关系、构造函数和析构函数等。最重要的区别是多态性,它是面向对象程序设计中最具有灵活性和扩展性的特征之一。