C++多继承中Base2基类不可访问问题及静态绑定实现需求
C++多继承访问错误解决方法
环境与问题场景
环境:Windows 10,IDE:Code::Blocks 20.03
遇到多继承下的编译错误,代码如下:
#include <iostream> using namespace std; class Base { public: Base() {} virtual ~Base() {} void show() { cout << "Base show()..." << endl; } }; class Base2 { public: Base2() {} virtual ~Base2() {} void show() { cout << "Base2 show()..." << endl; } }; void f(Base *b) { b->show(); } void g(Base2 *b2) { b2->show(); } class Derived : public Base, Base2 { public: Derived() {} virtual ~Derived() {} void show() { cout << "Derived show()..." << endl; } }; void h(Derived *d) { d->show(); } //driver program int main() { Base b; Base2 b2; Derived d; f(&b); //Base show()... g(&b2); //Base2 show()... h(&d); //Derived show()... //passing derived object f(&d); //Base show()... because of static binding g(&d); //error: 'Base2' is an inaccessible base of 'Derived' return 0; }
编译时抛出错误:'Base2' is an inaccessible base of 'Derived',需求是访问Base2的地址以执行静态绑定,输出Base2 show()...。
错误原因
在C++中,用class定义的类默认继承权限为私有继承,所以Derived : public Base, Base2里的Base2是私有继承。私有基类的继承关系对外不可见,外部代码无法将Derived*隐式转换为Base2*,这就是编译报错的核心原因。
解决办法
方法1:将Base2的继承改为public
直接修改Derived的继承声明,把Base2的继承权限设为public:
class Derived : public Base, public Base2 { // 原有代码不变 };
修改后g(&d)可正常编译,此时调用会触发静态绑定——因为show()不是虚函数,编译器会根据指针的静态类型Base2*调用对应函数,输出Base2 show()...。
方法2:显式类型转换(仅在无法修改继承权限时使用)
如果不能调整Derived的继承权限,可通过static_cast强制转换类型,绕过访问权限检查:
g(static_cast<Base2*>(&d));
这种方式破坏了封装性,仅适合特殊场景使用。
验证结果
修改后运行代码,g(&d)会输出:
Base2 show()...
内容的提问来源于stack exchange,提问作者Doniv
相关产品推荐
相关产品推荐

