可以覆盖(隐藏)一个非虚拟方法但仍然从子 class 显式调用它吗?
Is it okay to override (hide) a non-virtual method but still call it explicitly from a child class?
是否可以覆盖(隐藏)非虚拟方法但仍从子 class 显式调用它? It works 但我不知道它是特定于编译器的还是应该出于某种原因避免使用。 (我没想到它会根据 "hiding" 函数的术语工作。)
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();
}
编辑
这可能会更突出问题。
父类的非虚拟方法在我们无法更改的基础结构库中,但我们需要派生一个 隐藏 的 class(不是 "overrides," 正如我现在了解到的那样)一个有利于增强它的函数(并在途中明确调用父函数)。也就是说,派生的 class 需要 这个 "augmented" 函数来代替父函数。 这是隐藏父函数的有效方案吗?
没关系,但你没有压倒一切。正如你已经提到的,你在躲藏。覆盖意味着多态性将对您的对象起作用,而在您的情况下,它不会。
例如:
A* a = new B;
a->foo();
将调用方法 A::foo()
,而如果您要覆盖该方法(通过使其成为 virtual
),它将调用 B::foo()
.
另请注意,可能存在与实际签名相关的问题,例如,如果您有方法 B::foo(int)
,您将无法在 [=16= 上调用 foo(void)
]直接反对。
是否可以覆盖(隐藏)非虚拟方法但仍从子 class 显式调用它? It works 但我不知道它是特定于编译器的还是应该出于某种原因避免使用。 (我没想到它会根据 "hiding" 函数的术语工作。)
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();
}
编辑
这可能会更突出问题。
父类的非虚拟方法在我们无法更改的基础结构库中,但我们需要派生一个 隐藏 的 class(不是 "overrides," 正如我现在了解到的那样)一个有利于增强它的函数(并在途中明确调用父函数)。也就是说,派生的 class 需要 这个 "augmented" 函数来代替父函数。 这是隐藏父函数的有效方案吗?
没关系,但你没有压倒一切。正如你已经提到的,你在躲藏。覆盖意味着多态性将对您的对象起作用,而在您的情况下,它不会。
例如:
A* a = new B;
a->foo();
将调用方法 A::foo()
,而如果您要覆盖该方法(通过使其成为 virtual
),它将调用 B::foo()
.
另请注意,可能存在与实际签名相关的问题,例如,如果您有方法 B::foo(int)
,您将无法在 [=16= 上调用 foo(void)
]直接反对。