Considere el siguiente código. ¿Está garantizado que se creará una instancia de Derived<int>::foo()? foo() es virtual y es llamado por una función no virtual de la clase base.

#include <iostream>

class Base
{
public:
    void bar() { foo(); }
private:
    virtual void foo() = 0;
};

template <typename T> class Derived: public Base
{
public:
    Derived(T t_) : t(t_) {}
private:
    void foo() override { std::cout << t; }
    T t;
};

Derived<int> make_obj()
{
    return Derived<int>(7);
}
6
BlindDriver 16 dic. 2016 a las 01:12

2 respuestas

La mejor respuesta

La sección estándar 14.7.1 / 11 dice

No se especifica si una implementación instancia implícitamente una función miembro virtual de una plantilla de clase si la función miembro virtual no se instanciaría de otra manera.

Sin embargo, para una implementación típica de vtable, la instanciación de cualquier constructor de la clase requiere un vtable para que exista la clase, que debe contener un puntero a la definición de función virtual de la especialización. Entonces, en la práctica, la función virtual probablemente se instanciará.

6
aschepler 15 dic. 2016 a las 22:26

La tabla virtual siempre será instanciada para una jerarquía de clases, sin embargo, en su caso dependerá del compilador si el foo se inicializa realmente en la creación de una clase, ya que la clase en sí se inicializa en una pila y nunca se usa polimorfocalmente. La mesa virtual no tendrá sentido en su caso.

0
Ezra 15 dic. 2016 a las 22:48