c++虚函数覆盖和重载
C++ Virtual Function Overriding and Overloading
我有以下的类结构:
class X
{
// ...
};
class Y : public X
{
// ...
};
class IA
{
public:
virtual void Foo(X* x) = 0;
};
class A : public IA
{
public:
void Foo(Y* y)
{
Foo(static_cast<X*>(y));
}
};
class B : public A
{
public:
virtual void Foo(X* x) override
{
// ...
}
};
但是,这段代码会产生编译错误:
error C2664: 'void A::Foo(Y *)': cannot convert argument 1 from 'X *' to 'Y *'
修复它的方法是将A::Foo(Y*)替换为:
void Foo(Y* y)
{
static_cast<IA*>(this)->Foo(static_cast<X*>(y));
}
我很难理解为什么这个演员是必要的,希望你能给我一些启发。我也不确定这是否能保证是一个安全的演员。
根据我的理解,在重载解析过程中,编译器应该选择需要对参数进行最少隐式强制转换的函数。但这里的情况似乎并非如此。
A::Foo
隐藏IA::Foo
修复,使用using
:
class A : public IA
{
public:
using IA::Foo;
void Foo(Y* y)
{
Foo(static_cast<X*>(y));
}
};
相关文章:
- 在C++中混合覆盖和重载
- 我想覆盖运算符'='但是在重载之后,运算符没有将正确的信息传递给对象
- 为什么调用具有通用或 r 值引用的重载覆盖函数是不明确的?
- C++重载和覆盖
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- (C++)重载运算符<<,如果我不使用endl,则覆盖输出
- C++运算符重载???它不是更像是覆盖吗?
- 覆盖 ADL 选择的重载
- 为什么我得到 C2883:函数声明与 - 在仅覆盖基类中的一个重载时通过使用 - delcaration 引入
- 在类模板上覆盖方法,编译器看不到它,只能看到其他重载函数
- C++ 将重载和覆盖结合起来会导致奇怪的行为
- 同时覆盖和重载C++类中的方法
- 基成员函数的所有重载是否可以被单个模板化成员函数覆盖和转发到
- 如果内部类具有与外部类同名的函数,那么它是否在 C++ 和 Java 中隐藏了覆盖或重载
- C++ 重载和覆盖解析时间
- 如何轻松地覆盖多个重载方法
- 我们可以重载在子类中被覆盖的方法吗?
- 无法推断模板参数/'n'重载都无法覆盖所有参数类型
- c++虚函数覆盖和重载
- 为什么当我覆盖未覆盖的重载函数的其他重载之一时,没有继承该函数?