为什么即使参数是不同类型的,子类也会遮蔽父类方法



父类包含两个函数:第一个应该被子类覆盖,第二个(同名)只是使用不同的类型作为输入,然后使用覆盖的方法。现在我明白了,如果我在子类中定义一个具有相同名称和相同输入参数的方法,它将遮蔽(这是正确的表达式吗?)父方法。但是我仍然可以通过显式调用它来调用parents方法,例如:b.A::getSize(...).

我的问题是:为什么父方法得到阴影,即使输入参数类型不同? 为什么编译器不能找到父方法与正确的输入类型?请看下面的最小示例:

和额外的问题:是否有可能实现我可以调用父方法而不需要显式调用并且不修改main(){...}class B{...};或使用不同的名称的行为?

#include <cstdio>
class A{
public:
virtual void getSize(size_t &i) = 0;
void getSize(int &d){
size_t i;
getSize(i);
d = static_cast<int>(i);
}
};
class B : public A{
public:
void getSize(size_t &i) override{
i = 4;
}
};
int main(){
size_t t;
int i;
B b;
b.getSize(t);
b.getSize(i); // error: non-const lvalue reference to type 'size_t' (aka 'unsigned long') cannot bind to a value of unrelated type 'int'
b.A::getSize(i); // this works but is not acceptable (too much changes in production code)
printf("%zu, %d",t,i);
return 0;
}

您可以选择使用using语句公开该方法:

class B : public A
{
// ...
using A::getSize;
}

在您的代码片段中,您在许多地方使用了未初始化的值,这调用了UB。

相关内容

  • 没有找到相关文章

最新更新