C++ 重载和覆盖
C++ overloading and overriding
此代码生成以下编译错误:
error: no matching function for call to 'C::print(int)'
你能帮我弄清楚编译器生成该错误的过程吗,(为什么它忽略了 class 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);
}
print
的每个后续定义都隐藏了其父项的定义。您需要一个 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";}
};
Demo
您的指针指向 C*
,而不是 B*
。如果您的代码如下所示,您在技术上不需要 'unhide' 任何打印函数:
B* ptr = new C;
然而,这种隐藏并不是一个特别好的主意......你应该更喜欢覆盖和命名不同的功能。
编译器将 重载 解析为最接近的 (class) 类型。所以 class C
有效地 隐藏了 从 class B
.
继承的函数签名
要调用该特定函数,您必须明确限定其范围:
ptr->B::print (5);
// ^^^
重载意味着两个东西(例如函数)在相同的 space 或相同的作用域中具有相同的名称 class 但在重写中,我们在不同的作用域中重写函数的定义(class) 但名称仍然保持不变。
此代码生成以下编译错误:
error: no matching function for call to 'C::print(int)'
你能帮我弄清楚编译器生成该错误的过程吗,(为什么它忽略了 class 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);
}
print
的每个后续定义都隐藏了其父项的定义。您需要一个 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";}
};
Demo
您的指针指向 C*
,而不是 B*
。如果您的代码如下所示,您在技术上不需要 'unhide' 任何打印函数:
B* ptr = new C;
然而,这种隐藏并不是一个特别好的主意......你应该更喜欢覆盖和命名不同的功能。
编译器将 重载 解析为最接近的 (class) 类型。所以 class C
有效地 隐藏了 从 class B
.
要调用该特定函数,您必须明确限定其范围:
ptr->B::print (5);
// ^^^
重载意味着两个东西(例如函数)在相同的 space 或相同的作用域中具有相同的名称 class 但在重写中,我们在不同的作用域中重写函数的定义(class) 但名称仍然保持不变。