编译器如何实现继承
How does compiler implements inheritence?
可能的重复项:
C++:隐藏规则背后的理由
假设我有一个代码:
class A
{
public:
void f(int s) {}
};
class B:public A
{
public:
void f() {}
};
int main()
{ B ob;
ob.f(4);
}
然后在这种情况下,编译器生成一个错误,即"没有匹配函数调用'B::f(int)'"但是类 B 继承了 A 作为公共,因此 B 必须具有函数"void f(int s)"。不知道为什么编译器在这里生成错误?
这是因为B
定义了不同的f
,它隐藏了从A
继承的f
。如果您希望两者都在B
中可用(这很可能),则必须使用 using 声明将其纳入范围:
class B : public A
{
void f() {}
using A::f;
};
此行为在 [class.member.loopkup] 中指定,尤其是 paragrah 4。
当你在B
中声明void f()
时,这会隐藏从A
继承void f(int)
。您可以使用using
将其恢复到范围内:
class B: public A
{
public:
void f() {}
using A::f;
};
这
称为隐藏 - 您可以查看C++常见问题条目。它描述了问题和解决方案。
相关文章:
- 我应该避免多重实现继承吗
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 类继承,ENUM 与 AST 类实现的问题
- C++ 使用接口和默认实现继承
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 将实现从继承的 CRTP 注入到继承的接口类
- 接口实现和私有继承之间的交互
- C 如何仅实现多个继承类的一个构造函数
- 如何在部分类模板专业化中实现继承
- 从接口和实现C 继承
- 编译器如何实现继承
- 为什么无法使用'using'指令实现继承的纯虚拟方法?
- 在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)
- 从抽象基类的多个分部实现继承
- C++通过继承函数实现继承的抽象函数
- 如何在C++实现继承并解决错误"parent class is not accessible base of child class"?
- 编译器如何实现C++继承
- 代理dll:方法覆盖/方法转发(COM实现继承)
- 类型a必须实现继承的纯虚拟方法b
- 如何实现继承表单fstream的类