我已经看到它说C++隐藏了名称,以减少脆弱的基类问题.但是,我绝对不知道这有多大帮助.如果基类引入了以前不存在的函数或重载,它可能与派生类引入的函数或对全局函数或成员函数的非限定调用冲突 - 但我没有看到的是重载的不同之处.为什么虚拟函数的重载应该与其他函数区别对待?
编辑:让我再告诉你一些我正在谈论的内容.
struct base {
virtual void foo();
virtual void foo(int);
virtual void bar();
virtual ~base();
};
struct derived : base {
virtual void foo();
};
int main() {
derived d;
d.foo(1); // Error- foo(int) is hidden
d.bar(); // Fine- calls base::bar()
}
Run Code Online (Sandbox Code Playgroud)
在这里,foo(int)区别对待bar(),因为它是一个过载.
编译失败的例子:
class A{
public:
int f(int a) {return a;}
};
class B: public A {
public:
int f(int a, int b) {return a + b;}
};
int calculation(int num) {
B b;
return b.f(num);
}
Run Code Online (Sandbox Code Playgroud)
在调用站点b.f(num),gcc给出以下错误消息:
错误:没有匹配的函数可供调用
B::f(int&)
基类有一个可行的候选者,但由于某种原因编译器不会考虑它。
如果我将调用重写为b.A::f(num),那么它就可以正常工作。我不明白为什么这A::是必要的。为什么 的A::f重载解析逻辑不将其视为可行的候选者b.f?
以下C++代码会产生编译错误.
编译器(gcc 5.2.0)抱怨在第15行它找不到匹配函数来调用'Derived :: test_func()'; 但是如果test_func()从Base移到Derived,它编译时没有错误.
class Base {
public:
int test_func();
};
class Derived : public Base {
public:
template <typename T>
int test_func(T t);
};
template <typename T>
int Derived::test_func(T t)
{
test_func(); // line 15
return 0;
}
int Base::test_func()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果模板函数使用不同的名称(与模板函数名称不同)调用Base类中的其他函数,如下面的代码所示,它也可以编译.
class Base {
public:
int test_func_diff_name();
};
class Derived : public Base {
public:
template <typename T>
int test_func(T t);
};
template <typename T>
int Derived::test_func(T t)
{
test_func_diff_name();
return 0;
} …Run Code Online (Sandbox Code Playgroud)