第48课 同名覆盖引发的问题

本文深入探讨C++中父子类之间的赋值兼容性,包括子类对象如何作为父类对象使用,以及父类指针或引用指向子类对象时的行为。特别分析了函数重写在赋值兼容中的特殊表现,通过实验代码揭示了编译器如何处理这些情况。
本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结

父子间的赋值兼容

子类对象可以当作父亲对象使用(兼容性)

子类对象可以 直接赋值 给父类对象
子类对象可以 直接初始化 父类对象
父类指针 可以 直接指向 子类对象
父类引用 可以 直接引用 子类对象

编程实验

编写一个Parent类和一个Child类,Child类继承Parent类

#include <iostream>

using namespace std;

class Parent
{
public:
    int m_p;
    void func(int i)
    {
        m_p = i;
    }
    void func(int i, int j)
    {
        m_p = i + j;
    }
};

class Child : public Parent
{
public:
    int m_c;
    void func(int i, int j, int m)
    {
        m_c = i + j + m;
    }
};

在 main 中做如下操作
在这里插入图片描述

编译没有报错,说明第 33行,34行,35行是合法的。

我们再来改写程序,增加第37行和38行代码,用指向Child类对象的Parent类对象指针访问Child类对象成员
在这里插入图片描述
编译结果
在这里插入图片描述

编译报错,提示Parent 类中没有对应的成员变量和成员函数

通过实验得出如下结论

当使用父类指针(引用)指向子类对象时
1.子类对象 退化为父类对象
2.只能访问 父类中定义的成员
3.可以 直接访问 被子类 覆盖的 同名成员



特殊的同名函数

子类中可以 重定义 父类中 已经存在的成员函数
这种重定义发生在继承中,叫做函数重写
函数重写 是同名覆盖的一种特殊情况

在这里插入图片描述



思考

函数重写 遇上 赋值兼容 会发生什么?

编写一段实验程序来看下现象

#include <iostream>

using namespace std;

class Parent
{
public:
    int m_p;
    void func(int i)
    {
        m_p = i;
    }
    void func(int i, int j)
    {
        m_p = i + j;
    }
    void printf()
    {
        cout << "I'm Parent" << endl;
    }
};

class Child : public Parent
{
public:
    int m_c;
    void func(int i, int j, int m)
    {
        m_c = i + j + m;
    }
    void printf()
    {
        cout << "I'm Child" << endl;
    }
};

void print(Parent *p)
{
    p->printf();
}

int main(void)
{
    Child c;

    Parent p = c;
    Parent *p1 = &c;
    Parent& p2 = c;

    print(&p);
    print(&c);

    return 0;
}

运行结果

在这里插入图片描述

实验现象,当子类调用print函数时调用的竟然是父类的printf函数

问题分析

编译期间,编译器只能根据指针的类型判断 所指向的对象
根据赋值兼容,编译器认为父类指针指向的是父类对象
因此,编译结果只可能是 调用父类中定义的同名函数

在这里插入图片描述




小结

子类对象可以当作父类对象使用(赋值兼容)
父类指针可以 正确的指向子类对象
父类引用可以 正确的代表子类对象
子类中可以 重写 父类中的 成员函数

<think>好的,我现在要解决用户遇到的Git问题:克隆仓库时出现错误“fatal: destination path 'stdr_simulator' already exists and is not an empty directory”。首先,我需要理解这个错误的原因。根据引用[1]和[2],当目标目录已经存在并且不是空目录时,Git会拒绝克隆,因为这会覆盖现有文件,可能导致数据丢失。 接下来,我需要整理解决方案。根据引用中的信息,有几个可能的解决方法: 1. **删除或重命名现有目录**:这是最直接的解决方法。如果用户确定该目录中的文件不再需要,可以删除它,或者重命名以避免冲突。引用[2]提到可以手动删除或使用`rm -rf`命令,但需要注意数据安全。 2. **在空目录中初始化并关联远程仓库**:如果用户希望保留现有目录中的文件,可以进入该目录,初始化Git仓库,然后手动添加远程仓库地址,再拉取代码。引用[1]详细说明了这种方法的具体步骤,包括`git init`、`git remote add`、`git add`、`git commit`和`git push`。不过这里可能需要调整,因为用户可能需要先拉取远程代码,可能需要使用`git pull`来合并,特别是如果远程有README等文件的话。这时候可能会有冲突,需要处理。 3. **更换克隆协议**:引用[3]提到有时更换协议,比如从HTTPS切换到SSH,可能解决问题。不过这个错误通常和协议无关,可能更多是路径问题,但尝试更换协议可能排除其他潜在问题。 4. **处理SSL错误**:引用[4]提到了SSL_ERROR_SYSCALL错误,虽然用户当前的问题不是这个,但如果在后续操作中出现网络问题,可能需要检查SSH配置或生成新的密钥。不过这可能属于其他问题的解决方案。 需要验证这些方法的适用性。例如,如果用户的目标目录已经有文件,但用户希望将远程仓库的内容合并到现有目录中,这时候直接克隆是不行的,必须用第二种方法,手动关联远程并拉取。但需要注意,如果远程仓库有和本地同名的文件,可能会引发冲突,需要处理。 另外,用户可能需要了解为什么目标目录已经存在。是否之前克隆过,或者有同名目录?如果是误操作,删除即可。如果确实需要保留现有文件,必须选择第二种方法。 总结步骤时,应该分点说明,确保用户能逐步操作。同时需要提醒用户注意备份数据,尤其是删除目录或强制覆盖时,避免数据丢失。可能还需要解释每个步骤的作用,例如`git init`初始化仓库,`git remote add`关联远程等,让用户理解背后的原理,以便在类似情况下自行调整。 另外,引用[1]中的步骤似乎有些混淆,因为它提到的是将本地代码推送到远程,而用户的问题是关于克隆已有仓库到已有目录。因此,可能需要调整步骤,例如在初始化后执行`git fetch`和`git pull`来获取远程内容,而不是直接提交。这可能需要进一步澄清,避免用户操作错误。 最后,需要检查是否有其他可能的解决方案,比如使用`git clone`时指定不同的目录名,或者移动现有目录后再克隆。这些都是可行的替代方法,应该在回答中提及,确保用户有更多选择。</think>### 解决方案:Git克隆仓库时目标路径已存在且非空的问题 当使用`git clone`命令时,若目标路径(例如`stdr_simulator`)已存在且非空,Git会报错以防止覆盖现有文件[^1]。以下是逐步解决方法: --- #### **方法一:删除或重命名现有目录(适用于无需保留目录内容)** 1. **删除目录** 若目录内容无需保留,可直接删除: ```bash rm -rf stdr_simulator # 强制删除目录及其内容(谨慎操作) ``` 随后重新克隆仓库: ```bash git clone <仓库URL> stdr_simulator ``` 2. **重命名目录** 若需保留原目录内容,可重命名原目录后再克隆: ```bash mv stdr_simulator stdr_simulator_backup # 重命名为备份目录 git clone <仓库URL> stdr_simulator # 重新克隆到新目录 ``` --- #### **方法二:在现有目录中手动关联远程仓库(需保留目录内容)** 若需将远程仓库内容与本地目录合并(需谨慎操作): 1. 进入目标目录并初始化Git仓库: ```bash cd stdr_simulator git init ``` 2. 添加远程仓库地址: ```bash git remote add origin <仓库URL> ``` 3. 拉取远程分支内容(可能需要处理冲突): ```bash git pull origin master # 或其他分支名 ``` 4. 提交本地文件(若需将本地文件推送至远程仓库): ```bash git add . git commit -m "提交描述" git push -u origin master ``` --- #### **方法三:更换克隆协议(排除网络或权限问题)** 若问题与协议相关(如HTTPS限制),可尝试切换为SSH协议克隆[^3]: ```bash git clone git@github.com:用户名/仓库名.git ``` --- #### **注意事项** - **数据备份**:操作前确保重要文件已备份,尤其是删除目录时。 - **冲突处理**:若本地文件与远程仓库文件冲突,需手动解决冲突后再提交。 - **路径检查**:确认克隆路径是否正确,避免误操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzg2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值