cppTest-8.1:三种派生方式和单基&多基派生

本文详细解析了C++中派生类的三种权限等级:private、protected和public,以及它们如何影响基类成员的访问权限。通过实例展示了如何在派生类中访问和修改这些权限级别的成员,并探讨了单基派生与多基派生的区别。
/**
 *cppTest-8.1:三种派生方式和单基&多基派生
 *
   @@可理解级别为:private<protected<public(比Java少了default!)
  派生方式:private全变私有;protected降级;public保持级别。(派生不能提升权限!)
private派生方式:
	基类        派生类
	private     不可见
	protected   private
	public      private

 protected派生方式:
	基类        派生类
	private     不可见
	protected   private
	public      protected

public派生方式:
	基类        派生类
	private     不可见
	protected   protected
	public      public
	
 *author 炜sama
 */
#include<iostream.h>
#include<string.h>
class F{
public:
	int pubi;
};
class Father{		
private:
	int prii;
protected:
	int proi;
public:
	int pubi;
	Father(int prii2,int proi2,int pubi2){	    		
		prii=prii2;
		proi=proi2; 
		pubi=pubi2;
}
void show()
{
	cout<<"prii:"<<prii<<endl;
	cout<<"proi:"<<proi<<endl;
	cout<<"pubi:"<<pubi<<endl;
}
};

//各种单基派生示例:
class C1:public Father{//public派生会保持父类成员的访问权限的等级~
	//int prii;//可以再定义父类的属性!
	//定义各种子类的成员...
	int i;
public:
	//构造函数后面必须带上:Father(nm,ag,sx)以初始化父类!去掉后编译会出错~所以定义一个本类变量时会先调用父类的构造函数再调用本类的构造函数~
	C1(int prii2,int proi2,int pubi2,int i2):Father(prii2,proi2,pubi2){	    
		i=i2;
	}
	//重写父类方法
	void show()	{
		Father::show();//以这样的形式来直接访问父类成员!Java的话则是:super.show();
		cout<<"i:"<<i<<endl;
	}
};

class C2:protected Father{//protected派生会把父类成员的访问权限降级,public》protected,protected》private,private不变,因为它最低级~
public:
	C2(int prii2,int proi2,int pubi2):Father(prii2,proi2,pubi2){	    
		show();//父类的show函数在这里降级成了protected级的,但是在本类里还可以访问~
	}
};
class C3:private Father{//private派生会把父类成员的访问权限全变私有!
public:
	C3(int prii2,int proi2,int pubi2):Father(prii2,proi2,pubi2){	    
		show();//父类的show函数在这里变成了private级的,但是在本类里还可以访问~
	}
};

//多基派生:
class Cs:public F,public Father{
public:
	void test(){
		//继承的多个父类中如果有相同的成员不会出错,不过一旦访问该成员时就会出错:引用不明!(与Java多继承接口情况相同)
		//cout<<pubi<<endl;//错误!
		cout<<F::pubi<<endl;//正确!指明引用的是F的成员
	}
};

void main(){    
	C1 c1(1,2,3,4);
	//c1.Father::show();//同上,子类对象访问父类成员
	c1.show();
	//cout<<c1.prii<<endl;//错误!在类之外不能访问类里的private成员!
	//cout<<c1.proi<<endl;//错误!在类之外不能访问类里的protected成员!与Java不同,Java的main方法在类里,所以可以访问静态的protected成员~
	cout<<c1.pubi<<endl;//正确!C1为public派生,继承父类的public成员在子类里还是public成员,在类之外可以访问!

	C2 c2(1,2,3);
	//cout<<c2.pubi<<endl;//错误!pubi被protected派生降级为了protected级别,在这里无法方法了~
	//c2.show();//错误!同上

	C3 c3(1,2,3);
	//cout<<c3.pubi<<endl;//错误!pubi被private派生降级为了private级别,在这里无法方法了~
	//c3.show();//错误!同上
}

&lt;think&gt;根据用户提供的ldd命令输出,显示`libcpptestruntime64.so`已正确链接到指定路径:`/home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so`。这表明动态链接器能够找到该库文件,但之前运行时仍报错,问题可能在库路径配置上,而是其他原因。以下是进一步分析解决方案: ### 问题排查方向 1. **文件权限问题** 检查库文件是否具有可执行权限: ```bash ls -l /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` - 若权限足,添加读权限: ```bash chmod +r /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` 2. **库文件损坏** 验证库文件完整性: ```bash file /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` - 正常应输出:`ELF 64-bit LSB shared object, ...` - 若损坏,需重新安装Parasoft或从备份恢复 3. **架构兼容性** 确认程序与库的架构一致(均为64位): ```bash # 检查程序架构 file my_projectTest.exe # 检查库架构 file /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` 4. **依赖缺失** 检查该库的次级依赖: ```bash ldd /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so | grep &quot;not found&quot; ``` 5. **SELinux限制** 临时禁用SELinux测试: ```bash setenforce 0 # 需root权限 ./my_projectTest.exe ``` - 若可运行,需配置SELinux策略 ### 具体操作步骤 **步骤1:验证权限** ```bash # 查看库权限(第三组应有r--) ls -l /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so # 修复权限(如果需要) sudo chmod 755 /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` **步骤2:检查依赖链** ```bash # 查看库的完整依赖 ldd /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so # 示例输出中若出现&quot;not found&quot;,需安装对应包 ``` **步骤3:运行调试** 使用`strace`跟踪系统调用: ```bash strace -e openat ./my_projectTest.exe 2&gt;&amp;1 | grep cpptest ``` - 观察是否有访问拒绝(EACCES)或文件存在(ENOENT)错误 ### 预防措施 - 在部署环境中统一设置文件权限(如755) - 使用`checksec`工具验证二进制安全性配置 - 在容器化环境中确保所有依赖完整打包 &sect;&sect;相关问题&sect;&sect; 1. Linux系统中如何诊断动态链接库的次级依赖缺失问题? 2. 使用strace进行运行时错误诊断的关键步骤有哪些? 3. SELinux如何影响应用程序对共享库的访问权限? 4. 如何修复因文件权限配置错误导致的共享库加载失败? 5.架构系统中如何确保程序与依赖库的架构一致性?&lt;/think&gt;根据您提供的 `ldd` 输出,系统已成功找到并链接了 `libcpptestruntime64.so` 库文件: ``` libcpptestruntime64.so =&gt; /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so (0x00007f7ec0576000) ``` 这表明**库文件路径配置正确**,但之前运行时仍报错,问题可能转向其他方向。以下是针对此情况的深度排查方案: ### 关键排查方向 1. **文件权限验证** ```bash # 检查库文件权限 ls -l /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so # 检查可执行文件权限 ls -l ./my_projectTest.exe ``` - 需要至少 `-r--r--r--`(644)权限 - 修复命令:`chmod 755 libcpptestruntime64.so` 2. **库文件完整性检查** ```bash # 验证ELF文件头 file /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so # 检查文件是否损坏 strings libcpptestruntime64.so | head -n 20 ``` 3. **依赖库的依赖关系** ```bash # 检查libcpptestruntime64.so的次级依赖 ldd /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so | grep &quot;not found&quot; ``` 4. **运行时环境差异** ```bash # 检查当前环境变量 printenv | grep LD_ # 清除可能冲突的环境变量 unset LD_PRELOAD ``` 5. **文件系统错误** ```bash # 检查文件系统错误 ls -lL /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/libcpptestruntime64.so ``` ### 高级诊断方法 1. **使用`strace`追踪系统调用** ```bash strace -e trace=open,read,stat ./my_projectTest.exe 2&gt;&amp;1 | grep cpptest ``` 2. **GDB调试加载过程** ```bash gdb ./my_projectTest.exe (gdb) catch load (gdb) run ``` 3. **检查内核日志** ```bash sudo dmesg | grep cpptest ``` 4. **验证GLIBC兼容性** ```bash # 检查可执行文件要求的GLIBC版本 objdump -p ./my_projectTest.exe | grep -A10 &quot;Version References&quot; ``` ### 终极解决方案 如果以上排查均未解决问题: 1. **重新生成测试程序** 在Parasoft C++test中清理并重新构建测试套件 2. **更新Parasoft运行时库** ```bash # 从原始安装包提取库文件 sudo cp /path/to/installer/libcpptestruntime64.so /home/zhouweixiang/cpptest/cpptest/bin/engine/lib/ ``` 3. **静态链接选项** 在C++test配置中启用静态链接(增加二进制体积但避免动态依赖)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值