是否可以覆盖(隐藏)非虚方法,但仍然可以从子类中显式调用它? It works但我不知道它是否是特定于编译器的,或者由于某种原因应该避免。 (我没想到它会根据"隐藏"函数的术语来工作。)
class A
{
public:
void foo()
{
cout << "A::foo()" << endl;
}
};
class B : public A
{
public:
void foo()
{
cout << "B::foo()" << endl;
A::foo();
}
};
int main()
{
B b;
b.foo();
}
这可能会更多地关注这个问题。
父母的非虚拟方法位于我们无法更改的基础架构库中,但我们需要派生一个隐藏的类(不是&#34;覆盖, &#34;正如我现在所知道的那样一个支持增强它的功能(并在途中明确地调用父代)。也就是说,派生类需要这个&#34;增强&#34;用于代替父母的功能。 这是隐藏父功能的有效方案吗?
答案 0 :(得分:7)
没关系,但你不会压倒一切。正如您已经提到的,您正在隐藏。覆盖意味着多态性将对您的对象起作用,在您的情况下,它不会被激活。
例如:
A* a = new B;
a->foo();
将调用方法A::foo()
,而如果您要覆盖该方法(通过将其设为virtual
),则会调用B::foo()
。
另请注意,可能存在与实际签名相关的问题,例如,如果您使用方法B::foo(int)
,则无法在{{1}上调用foo(void)
直接对象。