此代码生成以下编译错误:
错误:没有匹配函数来调用'C :: print(int)'
你能帮我弄清楚编译器产生错误的过程,(为什么它忽略了B类中的函数)
#include <iostream>
using std::cout;
class A {
public:
virtual void print ()
{ cout << "A";}
};
class B : public A {
int x;
virtual void print (int y)
{cout << x+y;}
};
class C : public B {
public:
void print ()
{cout << "C";}
};
int main () {
C* ptr = new C;
ptr->print (5);
}
答案 0 :(得分:5)
using
的每个后续定义都隐藏了其父级。您需要class A {
public:
virtual void print ()
{ cout << "A";}
};
class B : public A {
public:
int x=1;
using A::print;
virtual void print (int y)
{cout << x+y;}
};
class C : public B {
public:
using B::print;
void print ()
{cout << "C";}
};
语句才能取消隐藏:
C*
您的指针指向B*
,而不是B* ptr = new C;
。你在技术上不需要取消隐藏&#39;如果你的代码看起来像这样的任何打印函数:
{{1}}
然而,这种隐藏并不是一个特别好的主意......你应该更喜欢覆盖,只是命名函数不同的东西。
答案 1 :(得分:1)
编译器为最近看到的(类)类型解析重载。因此,类C
有效隐藏从类B
继承的函数签名。
要调用该特定功能,您必须明确限定其范围:
ptr->B::print (5);
// ^^^
答案 2 :(得分:0)
重载意味着两个东西(例如函数)在相同的空间或范围中具有相同的名称,就像在同一个类中一样,但是在重写时我们在不同的范围(类)中重写函数的定义,但名称仍然保持不变。