psilogic: (Default)
[personal profile] psilogic
[ Предупреждение: для непрограммистов неинтересно ]

Пусть у нас есть два класса - базовый Base и отнаследованный от него Derived. В Derived есть конструктор, похожий на конструктор копии с параметром типа Base.

class Base
{
...
};

class Derived: public Base
{
public:
    Derived() {...}
    Derived(const Base &b) { /* важные манипуляции */ }
};


Допустим, в программе это используется вот так:

Derived d1;
Derived d2(d1);


И оно не работает.

Тщательное расследование показало эпическое западло...



В какой-то момент я внес часть кода в функцию:

void foo(Base &d1)
{
    Derived d2(d1);
    ...
}
...
Derived d1;
foo(d1);



И вдруг оно начало работать! Счастливый, я все так и оставил, предполагая разобраться как-нибудь потом. Сегодня это как-нибудь наступило.

Западло состоит в том, что в строке Derived d2(d1) не всегда вызывается второй конструктор и не будут выполняться "важные манипуляции". Вместо этого будет вызван "невидимый" автоматически сгенерированный конструктор-копии, и все поля будут тупо скопированы из d1 в d2.

Это происходит в том случае, если d1 имеет тип Derived. Если Base - то все хорошо. Вот почему та функция исправляла проблему. Так тоже будет работать:

Derived d2((Base&)d1);


Лечится это легко:

class Base
{
...
};

class Derived: public Base
{
public:
    Derived() {...}
    Derived(const Base &b) { /* важные манипуляции */ }
    Derived(const Derived &b) { /* важные манипуляции */ }
};


Но ведь и вляпаться тоже легко...

Date: 2009-07-15 09:37 am (UTC)
From: [identity profile] psilogic.livejournal.com
Такое появляется под влиянием многозначности естественного языка. Слово "стол" может означать самые разные столы в зависимости от контекста.

Date: 2009-07-15 09:43 am (UTC)
From: [identity profile] alisarin.livejournal.com
Но лингвистика, можно сказать, на полпути к систематизации этих неопределенностей, понятие "омонима" тебе известно, остальные частности, хотя и в вольном изложении, представлены здесь, ... хотя и в вольном изложении.

Date: 2009-07-15 09:45 am (UTC)
From: [identity profile] psilogic.livejournal.com
Лингвистика, может, и на полпути, а компьютерщики давно систематизировали и вовсю используют :)

Date: 2009-07-15 09:52 am (UTC)
From: [identity profile] alisarin.livejournal.com
Логика, ну ... безгранична. "Неопределенности систематизированы в том смысле, что они используются как 'несистематизированные неопределенности'" ... ;-)
Page generated Aug. 22nd, 2025 01:05 pm
Powered by Dreamwidth Studios