C++03 3.2.2
... Se utiliza un objeto o función no sobrecargada si su nombre aparece en una expresión potencialmente evaluada. Una función miembro virtual se utiliza si no es puro ...¿Se utiliza una función de miembro virtual si no es pura?
Y luego más tarde en 3.2.3
tenemos: Cada programa deberá contener exactamente una definición de cada función o un objeto no en línea que se utiliza en ese programa; no se requiere diagnóstico. La definición puede aparecer explícitamente en el programa, se puede encontrar en la biblioteca estándar o definida por el usuario, o (cuando corresponda) está implícitamente definida (ver 12.1, 12.4 y 12.8). Se debe definir una función en línea en cada unidad de traducción en la que se utiliza.
A lo largo de las líneas que estoy leyendo: una función virtual pura no se utiliza. El ODR se aplica solo a las funciones que se utilizan. ¿Esto no implica que lo siguiente sería legal? Supongo que la respuesta es no, no, pero entonces no puedo entender por qué.
//x.h
struct A
{
virtual void f() = 0;
};
//y.cpp
#include "x.h"
void A::f()
{
}
//z.cpp
#include "x.h"
#include <iostream>
void A::f()
{
std::cout << "Hello" << std::endl;
}
//main.cpp
#include "x.h"
struct B:A
{
virtual void f()
{
A::f();
}
};
int main()
{
A* p = new B;
p->f();
}
¿Este compila/vincula? Siento que habría un error de enlace debido a una implementación duplicada de la estructura A. –
@Rolland: ¿qué quieres decir? Una definición de clase puede y debe aparecer en cada unidad de traducción en la que se usa la clase ... –
Muy buena pregunta :) – icecrime