c++学习笔记之继承和多态

简介: 1、public 继承class A : public B(1)友元函数不能被继承(2)protected成员可以被派生类和友元访问

1、public 继承


class A : public B


(1)友元函数不能被继承


(2)protected成员可以被派生类和友元访问


2、派生类



(1)派生类构造函数如果未显式调用基类构造函数,则会隐式调用基类默认构造函数,没有则报错。


(2)派生类头文件中#include包含基类头文件


(3)派生类调用基类函数(已在派生类中重新定义过)

    基类名::基类函数          如 B::b(...)

    重新定义函数时一般会调用其基类函数,如果不加“基类名::”则会调用自己,形成无限递归。


(4)派生类有一个与基类中同名但签名不同的成员函数,那么会隐藏基类的那个成员函数。如:

    基类A有一个成员函数  void go(int i)

    派生类B有                  void go(int i, int j)

    b.go(1)会编译报错参数太少。(如果派生类没有go函数,则会直接调用基类的)


(5)多层派生关系:构造函数会从基类->派生类的顺序调用,析构函数则相反。


(6)派生类不会继承基类的构造函数、析构函数和重载的运算符。


3、public/private/protected 继承


继承public基类:基类的public成员成为派生类public成员,protected成员成为派生类的protected成员,派生类不能直接访问基类private成员。


继承protected基类:基类的public、protected成员成为派生类的protected成员,派生类不能直接访问基类private成员。


继承private基类:基类的public、protected成员成为派生类的private成员,派生类不能直接访问基类private成员。


4、基类、派生类指针


(1)基类指针指向派生类对象,可以调用基类成员,调用派生类成员则报错,但可以将基类指针显式强转成派生类指针就可以调用了。所以句柄类型决定哪个类函数被调用。


(2)派生类指针指向基类对象,编译错误。


5、virtual


virtual void a(...)

当通过指针调用virtual函数,则不再根据句柄来决定,而是根据指针所指的对象的类型选择合适的函数调用。


(1)一个函数声明为virtual,那么从整个继承层次的那一点向下所有类中都保持virtual,即使派生类重载此函数时并没有显式的声明virtual。

所以重载最好也显式声明virtual。


(2)当virtual函数通过按名引用被调用,如a.b(),调用哪个函数在编译时已经决定,即静态绑定,并不是多态性行为。

因此动态绑定只能通过指针句柄来完成。


6、抽象类


通过声明类的一个或多个virtual函数为纯virtual函数,可以使一个类成为抽象类。

纯virtual函数  virtual void a(...) const = 0;

“=0”称为纯指示符。

派生类必须重载纯virtual函数,否则实例化时编译报错。


7、运行时类型信息RTTI(dynamic_cast\typeid\type_info)


dynamic_cast(...)  向下强制类型转换

typeid(...)返回一个type_info对象的引用,其成员函数name()返回typeid实参的类型名称字符串(如“Class A”)。注意这个字符串与编译器有关,不同编译器可能不同。


8、virtual析构函数


删除一个派生类对象却使用基类指针,这样就无法调用派生类析构函数,会报行为未定义错误。

解决方法是声明基类析构函数为virtual,即使派生类析构函数与基类的不同名,也可以使这些析构函数为virtual函数,这时删除就能正常销毁。

(1)如果一个类会有virtual函数,就要提供一个virtual析构函数


(2)构造函数不能声明为virtual


目录
相关文章
|
23天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
30 1
【C++】继承
|
22天前
|
存储 编译器 数据安全/隐私保护
【C++】多态
多态是面向对象编程中的重要特性,允许通过基类引用调用派生类的具体方法,实现代码的灵活性和扩展性。其核心机制包括虚函数、动态绑定及继承。通过声明虚函数并让派生类重写这些函数,可以在运行时决定具体调用哪个版本的方法。此外,多态还涉及虚函数表(vtable)的使用,其中存储了虚函数的指针,确保调用正确的实现。为了防止资源泄露,基类的析构函数应声明为虚函数。多态的底层实现涉及对象内部的虚函数表指针,指向特定于类的虚函数表,支持动态方法解析。
29 1
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
47 2
C++入门12——详解多态1
|
2月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
59 1
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
87 1
|
2月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
43 1
|
2月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
21 0
|
2月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
36 0
|
2月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
39 0
|
20天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
30 2