Поскольку я практикую C ++ с некоторыми из моих коллег, один из них "столкнулся с ошибкой" в производном классе. Короче говоря, он вызывал базовый метод (callFoo
) и ожидал, что он вызовет A::Foo()
, но вместо этого он получил B::Foo()
.
Вот полный пример того, что я на самом деле спрашиваю , Я действительно не знаю, как объяснить лучше, чем это. Я действительно нашел решение, но это решение неудобно; это делает код вроде «санирующим» для будущих расширений наших классов. Есть ли другие доступные решения? (Может быть, ключевое слово?)
nb. Пример является исключительно демонстративным: в исходном примере callFoo()
был operator=
для Class A
. Я изо всех сил старался упростить его.
Пример 1: Нежелательное поведение
#include <iostream>
class A{
public:
virtual void Foo(){
std::cout<<"A Foo\n";
}
virtual void callFoo(){
Foo();
}
};
class B: public A{
public:
virtual void Foo() override{
std::cout<<"B Foo\n";
}
};
int main(){
B mB;
mB.Foo();
mB.callFoo();
return 0;
}
Пример 2: Неидеальное исправление; Есть ли другие решения?
class A{
public:
virtual void Foo(){
std::cout<<"A Foo\n";
}
virtual void callFoo(){
A::Foo();
}
};