У мене класи 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;