Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何实现继承性?_C++_Inheritance - Fatal编程技术网

C++ 编译器如何实现继承性?

C++ 编译器如何实现继承性?,c++,inheritance,C++,Inheritance,可能重复: 假设我有一个代码: 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)

可能重复:

假设我有一个代码:

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.member.loopkup]中有规定,特别是第4段。

当您在
B
中声明
void f()
时,这将隐藏从
A
继承的
void f(int)
。您可以使用
将其重新纳入范围:

class B: public A
{      
public:
    void f() {}
    using A::f;
};

这就是所谓的隐藏-你可以检查。它描述了问题和解决方案。

即,如果你想超载<代码>::(f)(int),用“/COD>B::F~()”,你必须做到以上。+ 1“隐藏”是正确的术语。@鲁基安格雷戈:谢谢,回答得更新。这两个答案非常相同。你不应该问“编译器是怎么做的”,而是“C++中的规则是什么……”。
class B: public A
{      
public:
    void f() {}
    using A::f;
};