Utiliser une classe abstraite en C ++

Je suis en train d'utiliser une classe abstraite lors du passage d'un objet étendu comme un paramètre à une fonction, mais mes tentatives ont jusqu'à présent conduit à certaines des erreurs du compilateur.

J'ai quelques indices quant à ce que le problème est, je ne suis évidemment pas autorisé à instancier une classe abstraite, et je crois qu'une partie du code dans Maclasse est en train de faire cela, même si ce n'est pas mon intention. Certaines recherches ont suggéré que je doit faire référence à l'objet en tant que pointeur pour obtenir ce que je veux, mais mes tentatives ont jusqu'à présent échoué et je ne suis même pas sûr que c'est la réponse (d'où ma demande ici).

Je vais présenter maintenant que je suis plus familier avec Java qu'en C++, et je suis sûr qu'une partie de mon problème est à cause de cela.

Voici un exemple de ce que je suis en train de faire dans mon programme:

class A {
    public:
        virtual void action() = 0;
};

class B : public A {
    public:
        B() {}

        void action() {
            //Do stuff
        }
};

class MyClass {

    public:

        void setInstance(A newInstance) {
            instance = newInstance;
        }

        void doSomething() {
            instance.action();
        }

    private:

        A instance;
};

int main(int argc, char** argv) {
    MyClass c;
    B myInstance;
    c.setInstance(myInstance);
    c.doSomething();
    return 0;
}

Cet exemple génère la même erreur de compilation que je suis arriver dans mon programme:

sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
test.cpp:20: error: cannot declare parameter newInstance to be of abstract type A
test.cpp:2: note:   because the following virtual functions are pure within A’:
test.cpp:4: note:   virtual void A::action()
test.cpp:30: error: cannot declare field MyClass::instance to be of abstract type A
test.cpp:2: note:   since type A has pure virtual functions
test.cpp: In function int main(int, char**)’:
test.cpp:36: error: cannot allocate an object of abstract type A
test.cpp:2: note:   since type A has pure virtual functions

Mise à jour

Merci pour les commentaires tout le monde.

Depuis, j'ai changé "Maclasse::instance pour contenir un pointeur de type A, mais maintenant, je reçois quelques bizarres les erreurs liées à la vtable:

sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
/tmp/ccoEdRxq.o:(.rodata._ZTI1B[typeinfo for B]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTI1A[typeinfo for A]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTV1A[vtable for A]+0x8): undefined reference to `__cxa_pure_virtual'
collect2: ld returned 1 exit status

Mon code modifié est comme suit (A et B n'ont pas été modifiés):

class MyClass {

    public:

        void setInstance(A* newInstance) {
            instance = newInstance;
        }

        void doSomething() {
            instance->action();
        }

    private:

        A* instance;
};

int main(int argc, char** argv) {
    MyClass c;
    B myInstance;
    c.setInstance(&myInstance);
    c.doSomething();
    return 0;
}

source d'informationauteur seanhodges