为什么 Child Class shadow Parent 方法即使参数类型不同
Why does Child Class shaddow Parent methods even though parameters are of different type
我的 parent class 有两个函数:On 应该被 child 覆盖,第二个(同名)只是使用不同的类型作为输入而不是使用覆盖的方法。现在我明白了,如果我在 child class 中定义一个具有 相同名称和相同输入参数 的方法,它会阴影(这是正确的表达方式吗? ) parents 方法。但我仍然可以通过显式调用 parents 方法来调用它,例如:b.A::getSize(...)
.
我的问题是:为什么即使输入参数类型不同,parent 方法也会被隐藏?为什么编译器找不到具有正确输入类型的 parent 方法?请参阅下面的最小示例。
还有额外的问题:是否有可能实现我可以调用 parents 方法的行为,而无需显式调用且无需修改 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。
我的 parent class 有两个函数:On 应该被 child 覆盖,第二个(同名)只是使用不同的类型作为输入而不是使用覆盖的方法。现在我明白了,如果我在 child class 中定义一个具有 相同名称和相同输入参数 的方法,它会阴影(这是正确的表达方式吗? ) parents 方法。但我仍然可以通过显式调用 parents 方法来调用它,例如:b.A::getSize(...)
.
我的问题是:为什么即使输入参数类型不同,parent 方法也会被隐藏?为什么编译器找不到具有正确输入类型的 parent 方法?请参阅下面的最小示例。
还有额外的问题:是否有可能实现我可以调用 parents 方法的行为,而无需显式调用且无需修改 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。