C++重载和覆盖

C++ overloading and overriding

本文关键字:覆盖 重载 C++      更新时间:2023-10-16

此代码生成以下编译错误:

错误:调用"C::p rint(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);
}

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";}
};

演示

你的指针是C*,而不是B*。如果您的代码如下所示,则在技术上不需要"取消隐藏"任何打印函数:

B* ptr = new C;

然而,这种隐藏并不是一个特别好的主意......您应该更喜欢覆盖和仅命名功能不同的东西。

编译器解析最接近的(类(类型的重载。所以类C有效地隐藏了从类B继承的函数签名。

要调用该特定函数,您必须明确限定其范围:

ptr->B::print (5);
// ^^^

重载意味着两件事(例如函数(在相同的空间或作用域中具有相同的名称,就像在同一类中一样,但在覆盖时,我们重写了不同作用域(类(中函数的定义,但名称仍然保持不变。