C++重载和覆盖
C++ overloading and overriding
此代码生成以下编译错误:
错误:调用"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);
// ^^^
重载意味着两件事(例如函数(在相同的空间或作用域中具有相同的名称,就像在同一类中一样,但在覆盖时,我们重写了不同作用域(类(中函数的定义,但名称仍然保持不变。
相关文章:
- 在C++中混合覆盖和重载
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- 为什么调用具有通用或 r 值引用的重载覆盖函数是不明确的?
- C++重载和覆盖
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- (C++)重载运算符<<,如果我不使用endl,则覆盖输出
- C++运算符重载???它不是更像是覆盖吗?
- 覆盖 ADL 选择的重载
- 为什么我得到 C2883:函数声明与 - 在仅覆盖基类中的一个重载时通过使用 - delcaration 引入
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- C++ 将重载和覆盖结合起来会导致奇怪的行为
- 同时覆盖和重载C++类中的方法
- 基成员函数的所有重载是否可以被单个模板化成员函数覆盖和转发到
- 如果内部类具有与外部类同名的函数,那么它是否在 C++ 和 Java 中隐藏了覆盖或重载
- C++ 重载和覆盖解析时间
- 如何轻松地覆盖多个重载方法
- 我们可以重载在子类中被覆盖的方法吗?
- 无法推断模板参数/'n'重载都无法覆盖所有参数类型
- c++虚函数覆盖和重载
- 为什么当我覆盖未覆盖的重载函数的其他重载之一时,没有继承该函数?