Como impedir que um objeto seja criado caso seja herdeiro de classes rivais [RESOLVIDO]

1. Como impedir que um objeto seja criado caso seja herdeiro de classes rivais [RESOLVIDO]

M.
XProtoman

(usa Fedora)

Enviado em 07/11/2016 - 00:22h

Boa noite a todos,

A situação é essa do código apresentado abaixo, preciso impedir que o programador que faça uma classe qualquer, como a C, que herde de B1 e B2, ele pode herdar apenas de uma das duas, não das duas ao mesmo tempo.

#include <iostream>

class A
{
public:
virtual ~A()
{
}
};

class B1: virtual public A
{
public:
B1();
virtual ~B1()
{
}
};

class B2: virtual public A
{
public:
B2()
{
// Tentativa de impedir que o objeto criado seja filho ao mesmo tempo de B1 e B2
if ( (dynamic_cast <B1 *>(this)) != NULL )
{
throw std::exception();
}
}
virtual ~B2()
{
}
};

B1::B1()
{
// Tentativa de impedir que o objeto criado seja filho ao mesmo tempo de B1 e B2
if ( (dynamic_cast <B2 *>(this)) != NULL )
{
throw std::exception();
}
}

class C: public B1, public B2
{
public:
virtual ~C()
{
}
};

int main()
{
C c;
return 0;
}



  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 07/11/2016 - 08:28h

Tente resolver isso em tempo de compilação. A alternativa mais simples que vejo, é um interface incompatível por retorno, para cada classe base:


struct Foo {
virtual void baz() = 0;
};

struct Bar {
virtual int baz() = 0;
};

struct Qux : public Foo, public Bar {
void baz () override {};
};

int main() {
Qux qux;
return 0;
}


Veja que neste exemplo, ambas as classes possuem uma função baz que possui um tipo de retorno diferente para cada. A classe não poderá herdar das classes Foo e Bar, pois haverá conflito pela assinatura da função.

A segunda maneira que penso, é utilizar type_traits e validar a herança.


#include <type_traits>

class Foo {};
class Bar {};
class Qux : public Bar, public Foo {};

int main() {
static_assert(!(std::is_base_of<Foo, Qux>::value && std::is_base_of<Bar, Qux>::value), "Qux é filha de Bar e Foo");
return 0;
}


--
Uilian Ries
Linux Counter: 521986





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts