Рассмотрим случай использования:Возможно ли заблокировать листинг ссылок?
- у вас есть Copyable класс
Base
, для которых вы на самом деле не волнует, что происходит с ним. - Публикация публично из него является классом
Derived
, который не должен быть конвертирован вBase
. Не за что. Даже ссылка на него, ссылка наBase
, другими словами, должно быть незаконным для неявной привязки:Derived& -> Base&
.
Примечания: Derived
класс может быть копируемым, только его внутренность никогда не должна когда-либо положить в обычный Base
объект. Так как запрет на инициализацию Base
от Derived
напрямую можно сделать, вопрос остается, если сборник может быть запрещен обойти его: Derived& -> Base& -> Base
.
Предположим, static_cast
, указатели не являются проблемой - только автоматическое связывание в вызовах функций.
Вот простой пример, демонстрирующий проблему:
#include <iostream>
using namespace std;
class Derived;
class Base
{
public:
Base(int var)
: m_var(var)
{
std::cout << "Base default ctor with value: " << m_var << std::endl;
}
Base& operator=(const Derived&) = delete;
Base& operator=(Derived&&) = delete;
Base(const Derived&) = delete;
Base(Derived&&) = delete;
int m_var;
};
class Derived : public Base
{
public:
Derived(int var)
: Base(var)
{
std::cout << "Derived default ctor with value: " << m_var << std::endl;
}
Base unprotect() const
{
std::cout << "Derived unprotected with value: " << m_var << std::endl;
return Base(m_var);
}
};
void foo(Base& base)
{
std::cout << "foo with value: " << base.m_var << std::endl;
// Base b2 = base; // just copied Derived, goal is to prohibit it!
}
int main()
{
Base b1(1);
foo(b1);
Derived d1(2);
foo(d1); // is it at all possible to disallow implicit Derived& -> Base&?
// rationale is to require explicit: Base& Dervied::getBaseRef()
// Base b2 = d1; // illegal: error: use of deleted function 'Base::Base(const Derived&)'
return 0;
}
_ «Наследование публично из него - это производный класс, который не должен быть конвертируемым в базу». _ Почему он наследует «Базу» тогда? Это звучит довольно странно. –
Это скорее проблема дизайна, чем проблема с кодом. –
@ πάνταῥεῖ из-за, к сожалению, большого кода * базы на основе 'Base' *, где явные приведения все равно будут использоваться, но вы могли бы отслеживать их * намного проще *. – hauron