📜  C++中各种继承类型中的运行时多态(1)

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

C++中各种继承类型中的运行时多态

在C++中,多态是一种特性,它允许使用基类指针来调用派生类中的函数。这是通过使用虚函数和继承实现的。C++中有三种继承类型,包括public、protected和private继承,这些继承类型中都可以使用运行时多态。

虚函数

虚函数是一个在基类中声明,可以在派生类中重新定义的函数。它通过使用动态链接来实现,这意味着基类指针指向派生类对象时,调用的是派生类中的函数。下面是一个简单的虚函数示例:

class Base{
public:
    virtual void func(){
        cout << "Base" << endl;
    }
};

class Derived: public Base{
public:
    void func(){
        cout << "Derived" << endl;
    }
};

int main(){
    Base *ptr = new Derived();
    ptr->func();    //输出Derived
    return 0;
}

在这个示例中,Base类定义了一个虚函数func(),Derived类覆盖了这个函数并实现了自己的版本。通过创建Derived类对象,并将其赋值给一个Base指针,我们可以调用Derived类中的函数。

public继承

public继承是最常见的继承类型,也是默认的继承类型。当public继承被用于派生类的时候,它继承了基类的所有public成员,但private成员只能被基类本身访问。下面是public继承的示例:

class Base{
public:
    virtual void func(){
        cout << "Base" << endl;
    }
};

class Derived: public Base{
public:
    void func(){
        cout << "Derived" << endl;
    }
};

int main(){
    Derived d;
    Base *ptr = &d;
    ptr->func();    //输出Derived
    return 0;
}

在这个示例中,Derived类从Base类中public继承,并重新定义了Base类中的虚函数。

protected继承

protected继承的效果和private继承相似,但在派生类中,protected成员可以被访问。当protected继承被用于派生类的时候,它继承了基类的所有protected和public成员,private成员只能被基类本身访问。下面是protected继承的示例:

class Base{
protected:
    virtual void func(){
        cout << "Base" << endl;
    }
};

class Derived: protected Base{
public:
    void func(){
        cout << "Derived" << endl;
    }
};

int main(){
    Derived d;
    Base *ptr = &d; //编译错误
    d.func();       //输出Derived
    return 0;
}

在这个示例中,Derived类从Base类中protected继承,并重新定义了Base类中的虚函数。由于protected成员不能在基类的外部访问,因此在主函数中无法使用Base指针调用Derived类的函数。

private继承

private继承是一种让派生类得到基类实现而不是接口的方法,它可以让基类中的所有成员在派生类中变为private成员。下面是private继承的示例:

class Base{
private:
    virtual void func(){
        cout << "Base" << endl;
    }
};

class Derived: private Base{
public:
    void func(){
        cout << "Derived" << endl;
    }
};

int main(){
    Derived d;
    Base *ptr = &d; //编译错误
    d.func();       //输出Derived
    return 0;
}

在这个示例中,Derived类从Base类中private继承,并重新定义了Base类中的虚函数。由于private成员不能在基类的外部访问,因此在主函数中无法使用Base指针调用Derived类的函数。