C++有关继承的问题

请问以下两种代码有什么区别吗?


class ReString:public BaseString
{
    public:
        void Inverse()
        {
            char temp;int Max=Length-1;
            int i;
            for(i=0;i<=Max/2;i++)
            {
                temp=Data[i];
                Data[i]=Data[Max-i];
                Data[Max-i]=temp;
            }
        }
        void Display()
        {
            cout<<"转置后的字符串:"<<Data<
class ReString :virtual public Basestring {
public:
    ReString(char* a):Basestring(a){}
    ReString();
    void Inverse();
    void Display();
};
ReString::ReString() {
    Data[maxsize - 1] = { '\0' };
    cout << "ReString Finish" << endl;
}
void ReString::Display() {
    cout << Data << endl;
}
void ReString::Inverse() {
    for (int i = 0; i < (Length - 1)/2; i++) {
        char a;
        a = Data[i];
        Data[i] = Data[Length - i - 2];
        Data[Length - i - 2] = a;
    }
    Data[Length - 1] = '\0';
}

该回答引用chatgpt:
这两段代码是实现字符串反转的代码,它们的实现方式略有不同。

第一段代码中,ReString 类继承自 BaseString 类,其中定义了 Inverse() 和 Display() 两个方法。在 Inverse() 方法中,通过交换字符串中的字符实现反转,并在 Display() 方法中输出结果。

第二段代码中,ReString 类同样继承自 BaseString 类,但它还有一个构造函数和一个没有参数的 Inverse() 方法。在构造函数中,将字符串数组 Data 中的最后一个元素设置为 '\0',并输出一条信息。在 Inverse() 方法中,同样是通过交换字符实现反转,但与第一段代码略有不同的是,它使用了字符串的长度 Length 来进行循环。

总的来说,两段代码都实现了字符串反转的功能,但它们的实现方式略有不同,而且第二段代码中加入了构造函数,并且使用了类的初始化列表初始化父类的成员变量。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7702379
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C++ 引用和指针有什么区别?
  • 除此之外, 这篇博客: C++模拟面试题中的 请详细说明堆和栈的区别? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 1、管理方式不同。栈由操作系统自动分配释放,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。
    堆由开发人员分配和释放,容易造成内存泄漏,若开发人员不释放,程序结束时由OS回收,分配方式类似于链表。

    关于堆上内存空间的分配过程,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确地释放本内存空间。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表。堆的内存地址生长方向与栈相反,由低到高

    2、空间大小不同。每个进程拥有的栈的大小远远小于堆的大小的大小。理论上,程序员可申请的堆带下为虚拟内存的大小,进程栈的大小64bits的windows默认为1MB,64bits的Linux默认为10MB;
    3、生长方向不同。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低。
    4、分配方式不同。堆都是动态分配的,而栈有两种分配方式:静态分配和动态分配。静态分配由操作系统完成的,比如局部变量的分配;动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手动实现。
    5、分配效率不同。栈由操作系统自动分配,会在硬件层次对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请和管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。
    6、存放内容不同。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保护,需要用栈来实现,首先入站的是主函数的下一条语句地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
    详解链接:https://blog.csdn.net/K346K346/article/details/80849966.

  • 您还可以看一下 黄强老师的C++模板进阶课程中的 什么是模板?小节, 巩固相关知识点