2012-07-10 20 views
10

El siguiente fragmento de código produce un error:C++ error de parámetro clase abstracta solución

#include <iostream> 

using namespace std; 

class A 
{ 

public: 

    virtual void print() = 0; 
}; 

void test(A x) // ERROR: Abstract class cannot be a parameter type 
{ 
    cout << "Hello" << endl; 
} 

¿Hay una solución/solución para este error otra/mejor que la sustitución de

virtual void print() = 0; 

con

virtual void print() = { } 

EDITAR: Quiero poder pasar cualquier clase que extienda/implemente la clase base A como parámetro utilizando poly morfismo (es decir A* x = new B() ; test(x);)

Saludos

+0

Por definición, la clase Abstarct no debe crearse una instancia por sí misma. Sus métodos deben ser reemplazados por las clases derivadas. Solo curiosidad, ¿qué estás tratando de lograr haciendo esto? – Mahesh

+1

Quiero hacer algo como A x = new B() y aprobar cualquier clase que extienda/implemente A. Debería haber especificado la pregunta mejor, supongo. – Cemre

+1

Antes de tratar de encontrar una solución/solución debemos entender el problema. La idea de pasar una clase abstracta como un parámetro "por valor" no tiene ningún sentido. ¿Que estás tratando de hacer? – AnT

Respuesta

20

Como no puede crear instancias de una clase abstracta, pasar una por valor es casi seguro un error; que necesita para pasar de largo puntero o por referencia:

void test(A& x) ... 

o

void test(A* x) ... 

paso por valor resultará en object slicing, con está casi garantizado para tener consecuencias inesperadas (en el mal sentido), por lo el compilador lo señala como un error.

+1

Yo diría que está ciertamente garantizado. –

+0

@LuchianGrigore Tiene razón, el corte siempre ocurrirá, incluso cuando no haya miembros de datos adicionales para cortar, porque el vtable se "cortará" al de la clase base. – dasblinkenlight

3

Por supuesto, cambiar la firma:

void test(A& x) 
//or 
void test(const A& x) 
//or 
void test(A* x) 

La razón por la que su versión no funciona porque es un objeto de tipo A lógicamente no tiene sentido. Es abstracto Al pasar una referencia o un puntero se da la vuelta porque el tipo real pasado como parámetro no es A, sino una clase de implementación de A (clase concreta derivada).

Cuestiones relacionadas