深入理解c++ 继承

发布时间:2023年12月29日

首先 我们得理解一些概念

基类(Base Class)

  • 基类是创建一个或多个派生类的原始类。
  • 它定义了派生类将继承的属性和方法。
  • 基类通常包含虚函数,这样可以在派生类中重写它们。
  • 基类还包含纯虚函数,这要求任何派生类都实现它们。

派生类(Derived Class)

  • 派生类是从基类派生出来的类。
  • 它继承了基类的所有公有和保护成员。
  • 派生类可以添加新的属性和方法,或者覆盖基类的函数。
  • 派生类可以改变继承的行为,通过重写基类的虚函数。

基类和派生类的区别

? ? ? 1)继承方式:基类是创建派生类的模板,而派生类是从这个模板继承而来的具体类。

?????2)功能扩展:派生类可以添加新的功能,或者覆盖基类的功能以改变其行为。

? ? ?3)代码重用:通过继承,派生类可以重用基类的代码,减少代码冗余。

? ? 4)多态性:通过继承和虚函数,可以实现多态性,即一个接口可以有多种实现方式。

? ? 5)访问修饰符:在C++中,派生类可以访问基类的公有和保护成员,但不能访问其私有成员。

? ? 6)构造函数和析构函数:在C++中,基类的构造函数和析构函数会被自动调用,不需要显式地在派生类中调用。

? ? 7)多重继承:C++支持多重继承,即一个类可以从多个基类继承。这可以带来一些复杂性,但也可以帮助解决一些设计问题。

????????C++中的继承是一种机制,允许一个类(派生类)继承另一个类(基类)的成员变量和成员函数。通过继承,派生类可以重用基类的代码,并且可以在此基础上添加或覆盖基类的功能。

????????继承可以分为公有继承、保护继承和私有继承三种方式。公有继承是最常用的继承方式,它表示派生类可以访问基类的公有和保护成员。保护继承表示派生类只能访问基类的保护成员,而私有继承表示派生类只能访问基类的私有成员。

????????在C++中,派生类可以继承基类的所有公有和保护成员,但不能继承其私有成员。派生类还可以添加新的成员变量和成员函数,或者覆盖基类的函数以改变其行为。

????????通过继承,可以实现代码重用和多态性。代码重用是指派生类可以重用基类的代码,避免重复编写相同的代码。多态性是指一个接口可以有多种实现方式,即可以通过基类的指针或引用来调用派生类的方法,从而实现动态绑定。

????????需要注意的是,继承也有一些潜在的问题,如虚函数表的使用和维护、构造函数和析构函数的调用顺序等。此外,多重继承也可能带来一些复杂性,需要谨慎使用。C++ 支持多重继承,即一个类可以继承自多个基类。此外,C++ 还支持虚拟继承。下面分别举例说明。

1,在 C++ 中,继承可以通过使用?:?或?extends?关键字来实现。下面是一个单继承简单的例子:

#include <iostream>  
  
// 基类  
class Animal {  
public:  
    void eat() {  
        std::cout << "The animal eats." << std::endl;  
    }  
};  
  
// 派生类  
class Dog : public Animal {  
public:  
    void bark() {  
        std::cout << "The dog barks." << std::endl;  
    }  
};  
  
int main() {  
    Dog myDog;  
    myDog.eat();  // 调用基类的函数  
    myDog.bark();  // 调用派生类的函数  
    return 0;  
}

在上面的例子中,Dog?类继承了?Animal?类。这意味着?Dog?类可以访问?Animal?类的所有公有和保护成员。在这个例子中,Dog?类重写了?eat?方法,并添加了一个新的方法?bark。在?main?函数中,我们创建了一个?Dog?对象?myDog,并调用了它的?eat?和?bark?方法。

2,以下是一个C++多重继承的示例:

#include <iostream>  
  
// 基类 A  
class A {  
public:  
    void showA() {  
        std::cout << "Class A" << std::endl;  
    }  
};  
  
// 基类 B  
class B {  
public:  
    void showB() {  
        std::cout << "Class B" << std::endl;  
    }  
};  
  
// 基类 C,继承自 A 和 B  
class C : public A, public B {  
public:  
    void showC() {  
        std::cout << "Class C" << std::endl;  
    }  
};  
  
int main() {  
    C c;  
    c.showA(); // 调用基类 A 的方法  
    c.showB(); // 调用基类 B 的方法  
    c.showC(); // 调用派生类 C 的方法  
    return 0;  
}

????????在上面的示例中,类 C 继承自类 A 和类 B,因此它可以访问类 A 和类 B 的公有成员。在主函数中,我们创建了一个类 C 的对象 c,并调用了它的方法。通过多重继承,我们可以实现代码重用和多态性,提高代码的可维护性和可重用性。

3,以下是一个C++虚拟继承的示例:

#include <iostream>  
  
// 基类 A  
class A {  
public:  
    void showA() {  
        std::cout << "Class A" << std::endl;  
    }  
};  
  
// 基类 B  
class B {  
public:  
    void showB() {  
        std::cout << "Class B" << std::endl;  
    }  
};  
  
// 派生类 C,继承自 A 和 B  
class C : virtual public A, virtual public B {  
public:  
    void showC() {  
        std::cout << "Class C" << std::endl;  
    }  
};  
  
int main() {  
    C c;  
    c.showA(); // 调用基类 A 的方法  
    c.showB(); // 调用基类 B 的方法  
    c.showC(); // 调用派生类 C 的方法  
    return 0;  
}

????????在上面的示例中,类 C 使用了虚拟继承来继承类 A 和类 B。虚拟继承可以消除虚基类在派生类中的重复实例化,从而解决菱形问题。在主函数中,我们创建了一个类 C 的对象 c,并调用了它的方法。通过虚拟继承,我们可以实现代码重用和多态性,提高代码的可维护性和可重用性。

文章来源:https://blog.csdn.net/A185822153/article/details/135282452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。