在C++中子类继承和调用父类的构造函数方法

本文深入探讨类构造方法的概念,解释构造方法如何初始化类的对象,特别关注构造方法与继承的关系,包括默认构造函数的使用及子类如何调用父类的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。

构造原则如下:

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

    6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:

     

 #include <iostream.h>
  class animal
  {
  public:
    animal(int height, int weight)
    {
      cout<<"animal construct"<<endl;
    }
    …
  };
  class fish:public animal
  {
  public:
    fish():animal(400,300)
    {
      cout<<"fish construct"<<endl;
    }
    …
  };
  void main()
  {
    fish fh;
  }

  在fish类的构造函数后,加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,系统就会去调用父类的带参数的构造函数去构造对象。



例外像MFC常见的CDialog继承可以看到这种例子..


头文件中


#pragma once
class CDrugDlg : public CDialogEx
{
	DECLARE_DYNAMIC(CDrugDlg)


public:
	CDrugDlg(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CDrugDlg();


// 对话框数据
	enum { IDD = IDD_DRUG_DIALOG };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnSize(UINT nType, int cx, int cy);
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg void OnDestroy();
};



实现文件

// DrugDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Medical.h"
#include "DrugDlg.h"
#include "afxdialogex.h"

// CDrugDlg 对话框

IMPLEMENT_DYNAMIC(CDrugDlg, CDialog)

CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/)
	:CDialogEx(CDrugDlg::IDD, pParent)
{

}

CDrugDlg::~CDrugDlg()
{
}




这种初始化方式,还常用来对类中的常量(const)成员进行初始化,如下面的代码所示:

class point
  {
  public:
     point():x(0),y(0)
  private:
     const int x;
     const int y;
  };


  当然,类中普通的成员变量也可以采取此种方式进行初始化,然而,这就没有必要了..


<think>我们正在处理一个管理员权限下仍无法解除subst映射的问题。根据引用[1]提供的命令,我们知道`subst Y: /D`用于取消Y:盘的映射。但即使用管理员权限执行仍提示“拒绝访问”,这通常表示有进程正在占用该虚拟驱动器。 根据之前的建议,我们已经尝试过以管理员身份运行结束资源管理器,但问题依旧。现在需要更深入的解决方案。 解决方案: 1. **检查进程占用**:使用`handle.exe`(Sysinternals工具集的一部分)来检查哪些进程正在使用Y:盘。 步骤: - 下载Sysinternals Suite:https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite - 解压后,以管理员身份运行命令提示符,切换到解压目录。 - 运行:`handle.exe Y:` - 根据输出结果,结束占用Y:盘的进程(注意:结束系统关键进程可能导致系统不稳定,请谨慎)。 2. **使用磁盘管理工具**:如果Y:盘是作为磁盘分区挂载的(尽管subst创建的是虚拟驱动器,但有时会被系统视为分区),可以尝试通过磁盘管理工具卸载。 - 按Win+R,输入`diskmgmt.msc`打开磁盘管理。 - 在磁盘列表中右键点击Y:盘,选择“更改驱动器号路径”。 - 点击“删除”按钮(注意:这不会删除数据,只是移除驱动器号)。 3. **重启资源管理器**:有时资源管理器会锁定驱动器,尝试结束资源管理器进程再执行命令。 - 在任务管理器中结束“Windows资源管理器”进程。 - 在管理员命令提示符中执行`subst Y: /D`。 - 在任务管理器中重新启动资源管理器(文件→运行新任务→输入`explorer.exe`)。 4. **重启到安全模式**:在安全模式下,许多非必要的进程不会启动,可能不会占用Y:盘。 - 重启电脑,在启动时按F8进入高级启动选项,选择“安全模式”。 - 以管理员身份运行命令提示符,执行`subst Y: /D`。 5. **使用注册表编辑器**:subst映射在注册表中也有记录,可以尝试手动删除(谨慎操作)。 - 按Win+R,输入`regedit`打开注册表编辑器。 - 导航至:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices` - 在右侧找到名为`Y:`的项,右键删除(如果存在)。 - 重启电脑。 6. **使用PowerShell命令**:尝试使用PowerShell的磁盘管理命令。 ```powershell # 以管理员身份运行PowerShell Remove-PSDrive -Name Y -Force -ErrorAction SilentlyContinue ``` 7. **检查组策略限制**:某些组策略可能禁止删除映射驱动器。 - 按Win+R,输入`gpedit.msc`打开组策略编辑器。 - 导航至:用户配置→管理模板→Windows组件→文件资源管理器 - 检查“删除‘映射网络驱动器’‘断开网络驱动器’”策略是否启用,如果启用则禁用它。 8. **系统文件检查**:运行系统文件检查器扫描并修复系统文件。 ```cmd sfc /scannow ``` 如果以上方法均无效,考虑重启计算机后立即尝试(在后台服务完全启动前执行命令),或者创建新的管理员账户尝试。 注意事项: - 操作注册表组策略前建议备份。 - 结束进程时注意不要结束系统关键进程。 流程图总结: ```mermaid graph TD A[以管理员运行CMD执行subst Y: /D失败] --> B[使用handle.exe检查占用进程] B -->|找到占用进程| C[结束该进程并重试] B -->|未找到| D[尝试磁盘管理工具删除驱动器号] D -->|成功| E[完成] D -->|失败| F[重启资源管理器后重试] F -->|成功| E F -->|失败| G[安全模式操作] G -->|成功| E G -->|失败| H[注册表删除Y:项] H -->|成功| E H -->|失败| I[使用PowerShell命令] I -->|成功| E I -->|失败| J[检查组策略] J -->|调整策略后成功| E J -->|失败| K[系统文件检查] K -->|修复后成功| E K -->|失败| L[重启后立即尝试或新建账户] ``` 如果问题仍然存在,可能需要考虑系统还原或修复安装。 §§相关问题§§ 1. 如何永久保留`subst`创建的映射? 2. 除了`subst`,还有哪些方法可以创建虚拟驱动器? 3. 如何查看当前系统中所有的驱动器映射?</think>### 解决管理员模式下 `subst Y: /D` 仍提示"拒绝访问"的问题 当以管理员身份运行命令提示符后执行 `subst Y: /D` 仍失败时,表明系统存在深层资源占用或权限冲突。以下是系统化的解决方案: --- #### **一、强制终止占用进程(关键步骤)** 1. **使用 PowerShell 查找占用进程**: ```powershell # 以管理员身份运行 PowerShell Get-Process | Where-Object { $_.Path -like "Y:*" } | Stop-Process -Force ``` - 此命令会强制结束所有访问 Y: 盘的进程[^1]。 2. **使用资源监视器定位**: - 按 `Win+R` 输入 `resmon` - 在"磁盘"选项卡中筛选 `Y:` 驱动器 - 右键结束所有关联进程(如 `explorer.exe` 等) --- #### **二、注册表级解决方案** 3. **手动删除驱动器映射**: 1. 按 `Win+R` 输入 `regedit` 2. 导航至: ``` HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices ``` 3. 删除右侧名为 `Y:` 的键值 4. **重启系统**使更改生效 4. **修复注册表权限**: 1. 右键 `DOS Devices` 项 → 权限 → 高级 2. 更改"所有者"为 `Administrators` 3. 勾选"替换子容器对象的所有者" 4. 赋予 `SYSTEM` `Administrators` **完全控制**权限 --- #### **三、系统级修复工具** 5. **磁盘错误检测与修复**: ```cmd chkdsk C: /f /r ``` - 对**原始物理驱动器**(非 Y:)执行检查,修复底层文件系统错误[^3]。 6. **系统文件扫描**: ```cmd sfc /scannow dism /online /cleanup-image /restorehealth ``` --- #### **四、替代解除方法** 7. **使用磁盘管理工具**: ```powershell # PowerShell 管理员模式 Remove-Partition -DriveLetter Y -Confirm:$false -ErrorAction Ignore ``` 8. **重启到安全模式**: 1. 按 `Win+R` 输入 `msconfig` 2. 在"引导"选项卡勾选"安全引导" 3. 重启后直接执行 `subst Y: /D` --- #### **故障排查流程图** ```mermaid graph TD A[管理员CMD执行 subst Y: /D] --> B{是否成功?} B -->|失败| C[强制结束占用进程] C --> D[注册表删除Y:映射] D --> E[修复注册表权限] E --> F[磁盘错误检测] F --> G[系统文件修复] G --> H[安全模式操作] H --> I[成功解除] ``` > ⚠️ **注意**:若映射是通过脚本创建的,需确保解除命令在**相同用户会话**中执行。跨会话操作需通过注册表或组策略实现持久化修改。 --- ### 相关问题 1. 如何永久保留 `subst` 创建的虚拟驱动器映射? 2. 系统重启后 `subst` 映射自动失效,如何实现开机自动重建? 3. 解除映射时提示"参数错误"应如何处理? [^1]: 进程占用是导致资源锁定的常见原因,需强制结束关联进程 [^3]: 磁盘底层错误可能导致虚拟驱动器操作异常,需修复原始物理驱动器
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值