Мне любопытно, чем отличаются поля поиска Python и C ++ с использованием унаследованных геттеров. Рассмотрим эти два фрагмента кода и их результаты.


class Base: 
    x = 10
    def get_x(self):
        return self.x

class Derived(Base):
    x = 20

print(Base().get_x())
print(Derived().get_x())

Выходы

10
20

С другой стороны, рассмотрим следующий C ++,

class Base{
    public:
    int x = 10 ; 
    
    virtual int get_x(){
     return this->x;    
    }
};

class Derived : public Base{
    public:
    int x = 20;
    
}; 

void main(){

cout << Base().get_x() << endl; 
cout << Derived().get_x() << endl; 

};

Выходы

10
10

Почему два фрагмента кода имеют разные результаты? Какая внутренняя работа происходит в этих фрагментах кода, что вызывает разницу в выводе? Спасибо за помощь!

0
Franklin V 6 Апр 2021 в 03:37

1 ответ

Лучший ответ

У них разные результаты, потому что C ++ и Python - два принципиально разных языка, и они работают по-разному.

Версия C ++ логически не эквивалентна версии Python. Версия C ++ имеет два совершенно разных члена класса с именем x, которые принадлежат двум разным классам. Объявление члена класса с тем же именем, что и имя члена его суперкласса, просто объявляет другой член класса, не имеющий отношения к члену с таким же именем в суперклассе. Верно, что один является подклассом другого, но это не имеет значения. Получатель знает только об одном из них, поэтому установка другого члена класса с тем же именем не имеет никакого эффекта.

1
Sam Varshavchik 6 Апр 2021 в 00:41