Создать объект неизвестного класса (два унаследованных класса) - PullRequest
1 голос
/ 27 апреля 2010

У меня есть следующие классы:

class A {
    void commonFunction() = 0;
}

class Aa: public A {
    //Some stuff...
}

class Ab: public A {
    //Some stuff...
}

В зависимости от пользовательского ввода я хочу создать объект Aa или Ab. Моя мысль о подмене была такой:

A object;
if (/*Test*/) {
    Aa object;
} else {
    Ab object;
}

Но компилятор дает мне:

error: cannot declare variable ‘object’ to be of abstract type ‘A’
because the following virtual functions are pure within ‘A’:
//The functions...

Есть хороший способ решить эту проблему?

Ответы [ 4 ]

7 голосов
/ 27 апреля 2010

Использовать указатель:

A *object;
if (/*Test*/) {
    object = new Aa();
} else {
    object = new Ab();
}
2 голосов
/ 27 апреля 2010

'A' - абстрактный класс. У него нет собственной реализации для commonFunction (), и, следовательно, его нельзя создать напрямую. Только его потомки могут быть созданы (при условии, что они реализуют все абстрактные методы).

Если вы хотите создать экземпляр класса-потомка на основе ввода, а затем использовать этот объект в общем коде, сделайте что-то вроде этого:

A* object;
if (/*Test*/) {
    object = new Aa;
} else {
    object = new Ab;
}
...
object->commonFunction();
...
delete object;
2 голосов
/ 27 апреля 2010

Как уже отмечалось, полиморфизм во время выполнения в C ++ работает либо через указатель, либо через ссылку. В общем, вы ищете Factory Design Pattern .

2 голосов
/ 27 апреля 2010
A * object = NULL;
if (/*Test*/) {
    object = new Aa;
} else {
    object = new Ab;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...