编译C++代码时遇"C*隐式转换为A*不被允许"错误求排查
关于C++中隐式转换错误的分析与解决办法
先看你碰到的错误提示:Implicit conversion of 'C *' to 'A *' not allowed in function C::add(),结合你的代码来看,问题核心出在多层继承的权限控制上,咱们一步步拆解:
错误原因分析
你的类继承链是 A <-protected- B <-public- C:
- 类B以
protected方式继承A,这会让A的所有public成员(包括a和get())在B内部变成protected权限。 - 当C以public方式继承B后,B里的protected成员(也就是原属于A的那些)在C中依然是protected属性。这时候问题来了:你在C的public成员函数
add()里直接访问a和get(),旧版本编译器(比如你用的iostream.h这类老式头文件,大概率是Turbo C++)会在处理跨多层继承的protected成员访问时,触发隐式转换检查——编译器会尝试把C*(也就是当前的this指针)转换成A*来访问A的成员,但因为B是protected继承A,这个跨层的指针转换是被C++标准禁止的,所以抛出了这个错误。
解决办法
这里有几个实用的方案,你可以根据需求选择:
方案1:修改B的继承方式为public
把B继承A的权限改成public,让A的public成员在B中保持public属性,C继承后就能直接访问:
#include<iostream.h> #include<conio.h> class A { public: int a; int get() { return 10; } }; class B: public A { // 你的其他代码 }; class C: public B { public: void add() { cout<<a; cout<<get(); } }; void main() { C ob; ob.add(); getch(); }
方案2:在B中封装访问接口(保持原有继承权限)
如果不想改变B对A的protected继承,可以在B里新增public成员函数,用来封装A的a和get(),让C通过这些接口间接访问:
#include<iostream.h> #include<conio.h> class A { public: int a; int get() { return 10; } }; class B: protected A { public: // 封装A的成员,提供给子类访问的接口 int getAVal() { return a; } int callGet() { return get(); } // 你的其他代码 }; class C: public B { public: void add() { cout<<getAVal(); cout<<callGet(); } }; void main() { C ob; ob.add(); getch(); }
这种方式既能保留B对A的protected继承权限,又能让C合法访问需要的成员。
方案3:用this指针明确访问(仅适配部分旧编译器)
有些旧版本编译器中,你可以在C的add()里用this->a和this->get()明确指定访问路径,可能绕过隐式转换检查:
void add() { cout<<this->a; cout<<this->get(); }
不过这个方案兼容性较差,更推荐前两种。
另外提一句,你使用的iostream.h和conio.h是非常老旧的非标准头文件,现代C++标准使用<iostream>,并且需要通过std::cout或者using namespace std;来调用输出,getch()也不是标准库函数,建议尽量迁移到GCC、Clang等现代编译器。
内容的提问来源于stack exchange,提问作者RTS
相关产品推荐
相关产品推荐

