/ / як визначити оператор неявного кастингу - c ++

як визначити неявний оператор відливання - c ++

У мене класи A, B. B походить від A із захищеним, тому для включення неявного кастингу від B до A я додав оператор кастингу, але я отримую помилку при його неявному використанні (все нормально, коли явно його використовую).

Як змусити цей код працювати ??

class A
{
public:
int a;
};


class B : protected A {
public:
int b;
operator const A&()const { return *this; }
};

B b;
const A& a = b; // ERROR: error C2243: "type cast" : conversion from "const b *" to "const A &" exists, but is inaccessible

Як зробити кастинг неявним?

Відповіді:

2 для відповіді № 1

Наданий вами оператор перетворення вже є неявний. Проблема, з якою ви стикаєтеся, полягає в тому, що компілятор бачить дві різні послідовності конверсії B до const A&, похідне до базового посилання та ваш користувачза умови перетворення. Є замовлення на конверсії, і конверсія похідних даних до базових вважається кращою, ніж будь-яка конверсія, надана користувачем, тому ваша operator const A&() const не буде обраний.

Просто зробіть спадщину загальнодоступною. Ви намагаєтеся створити спільну конструкцію, яка не дає жодної користі. Що ви хочете отримати, переймаючи спадщину захищений? Уникати оновлень? Чому ви все одно намагаєтесь забезпечити однакову конверсію? Ви маєте намір дозволити лише половину інтерфейсу ( const частина)? Тоді ви не стежите за LSP, оскільки ваш похідний об'єкт не може бути використаний як база ...


0 для відповіді № 2

Очевидно, що оператором перетворення типів євизначено в B, тому воно недоступне для об'єктів типу A. Те, що ви намагаєтеся зробити, неможливо в C ++. Це тому, що вказівник "цей" є постійним вказівником. Отже, якщо ви спробуєте написати наступний код у тілі A, він не вийде: A(B* b) { this = b;//error, "this" pointer is a constant pointer. }

Іншими словами, ви не можете неявно зробити посилання типу A на об'єкт типу B. У кращому випадку ви можете спробувати переосмислити акторський склад і подивитися, чи працює він.


0 для відповіді № 3

Гаразд - тому я вибрав інший дизайн - використовувати композицію замість спадкування. Таким чином я можу визначити екземпляр A, який захищений

class B {
protected:
A a;
public
operator const A&()const { return a; }
};

B b;
const A& a = b;