是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它
Is it okay to override (hide) a non-virtual method but still call it explicitly from a child class?
是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它?它有效,但我不知道它是编译器特定的,还是出于某种原因应该避免。(我没想到它会基于"隐藏"功能的术语工作。)
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();
}
编辑
这可能会使问题更加集中。
父方法的非虚拟方法在一个我们无法更改的基础结构库中,但我们需要派生一个隐藏的类(而不是我现在学到的"重写")一个函数,以支持一个增强它的函数(并在途中显式调用父方法)。也就是说,派生类需要使用这个"增强"函数来代替父函数这是隐藏父函数的有效场景吗
这没关系,但您没有重写。正如你已经提到的,你在躲藏。重写意味着多态性将对您的对象起作用,而在您的情况下,它不会起作用。
例如:
A* a = new B;
a->foo();
将调用方法A::foo()
,而如果要覆盖该方法(通过使其为virtual
),它将调用B::foo()
。
还要注意,可能存在与实际签名相关的问题,例如,如果您有方法B::foo(int)
,则无法直接在B
对象上调用foo(void)
。
相关文章:
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 由于签名差异,调用了错误的子类函数
- 函数从唯一代码调用正确的子类方法
- 如何使基类从子类调用覆盖函数
- 字符串为函数,由其他子类调用,具有整数值
- 子类调用意外的重载函数
- 从 C++ 中的子类调用重载父类的方法
- C ++如何使用子类调用函数,具有超类指针
- 在C++中,如何从父类变量的子类调用重载方法
- 从另一个子类中的子类调用函数
- C++ 模板子类调用错误的父构造函数
- 从子类调用父类虚函数
- 从模板子类调用模板基类的重写模板成员函数
- 如何使一个函数只能由c++中的某些子类调用?
- 从子类调用非虚方法
- 子类调用超类构造函数
- c++继承从父类的变量上的子类调用函数
- 子类调用基类构造函数,然后使用子类Arduino c++中基类的实例方法
- 用子类调用时匹配模板而不是基类的重载函数模板
- 通过多级继承从模板子类调用基类的模板方法