父子之间的冲突

父子类冲突:隐藏与重载在C++中的理解

父子之间的冲突

父子之间变量的冲突

  • 子类可以定义父类中的同名成员
  • 子类中的成员将隐藏父类中的同名成员
  • 父类中的同名成员依然存在于子类中
  • 通过作用域分辨符(::)访问父类中的同名成员
#include <iostream>

using namespace std;

class Parent
{
public:
    int i;
    Parent()
    {
        cout<<"Parent() : "<<"&i = "<<&i<<endl;
    }
};
class Child : public Parent
{
public:
    int i;
    Child()
    {
        cout<<"Child() : "<<"&i = "<<&i<<endl;
    }
};

int main(int argc, char const *argv[])
{
    Child c;
    cout<<"&c.i = "<<&c.i<<endl;
    cout<<"&c.Parent::i"<<&c.Parent::i<<endl;
    return 0;
}

父子之间函数的冲突

  • 子类中的函数将隐藏父类的同名函数
  • 子类无法重载父类的成员函数
  • 使用作用域分辨符访问父类中的同名函数
  • 子类可以定义父类中完全相同的成员函数

小结

  • 子类可以定义父类中的同名成员
  • 子类中的成员将隐藏父类中的同名成员
  • 子类和父类中的函数不能构成重载关系
  • 子类可以定义父类中完全相同的成员函数
  • 使用作用域分辨符访问父类中的同名成员
父子进程是否会因为使用同一个端口而导致端口冲突,取决于具体的资源管理和操作系统行为。在 Linux 和 Windows 系统中,父进程创建的 socket 资源在 `fork()` 或 `CreateProcess()` 后会被子进程继承,这种继承机制可能导致端口绑定冲突的问题。 在 Linux 系统中,当父进程调用 `fork()` 创建子进程后,子进程会继承父进程的所有打开文件描述符,包括监听 socket。此时,父子进程都可以访问该 socket,并继续监听相同的端口。如果父进程退出而子进程仍在运行,该 socket 可能仍然处于绑定状态,导致新的父进程无法绑定到相同端口,从而引发端口冲突。为避免此类问题,通常的做法是在子进程中关闭监听 socket,仅保留用于通信的客户端 socket[^1]。 ```c int server_fd = socket(AF_INET, SOCK_STREAM, 0); bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); listen(server_fd, 5); while (1) { int client_fd = accept(server_fd, NULL, NULL); pid_t pid = fork(); if (pid == 0) { close(server_fd); // 子进程关闭监听 socket handle_client(client_fd); exit(0); } else { close(client_fd); // 父进程关闭客户端 socket } } ``` 在 Windows 系统中,情况类似。若父进程通过 `CreateProcess` 启动子进程,子进程默认会继承父进程的 socket 资源。当父进程被强制终止后,子进程可能仍然持有绑定到特定端口的 socket,导致新启动的父进程无法绑定该端口。为防止端口被意外继承,可以在创建子进程时配置 `bInheritHandles` 参数为 `FALSE`,或在启动子进程前关闭不需要继承的 socket[^3]。 为了避免父子进程间因 socket 继承导致的端口冲突,可采取以下措施: - 在子进程中主动关闭监听 socket,避免多个进程持有同一 socket 的引用。 - 在创建子进程时设置 `close_fds=True`(Python 中的 `subprocess.Popen`)或禁用句柄继承(Windows 中的 `CreateProcess`),防止子进程继承不必要的文件描述符。 - 使用 `SO_REUSEADDR` 选项允许在短时间内重用已被关闭但仍处于 `TIME_WAIT` 状态的端口,减少绑定失败的可能性[^1]。 ### 示例代码(Python 中防止子进程继承 socket) ```python import subprocess # 设置 close_fds=True 防止子进程继承文件描述符 subprocess.Popen(('nohup sh restart.sh',), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) ``` ### 总结 父子进程确实可能因为使用同一个端口而导致端口冲突,尤其是在子进程继承了父进程的 socket 文件描述符的情况下。为避免此类问题,应合理管理 socket 的生命周期,确保子进程不继承不必要的资源,并在程序设计中考虑资源释放的时机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值