преобразование указателя базового класса в неизвестный указатель производного класса

У меня есть 5 производных классов от абстрактного базового класса. Одна функция перегружен, который существует в каждом производном классе, давайте назовем это, print(), Пример для производного 4 класса:

Derived4::print(*Derived1)
Derived4::print(*Derived2)
Derived4::print(*Derived3)
Derived4::print(*Base)

Как я уже говорил, все производные классы имеют функцию печати, но аргументы разные, как

Derived1::print(*Derived2)
Derived1::print(*Derived3)
Derived1::print(*Derived4)
Derived1::print(*Base)

Все объекты хранятся внутри вектора как

vector<Base*> a

Когда я беру один из них из вектора и пытаюсь вызвать функцию print, все вызовы направляются в функцию print (* Base). Мне не разрешается хранить типы, поэтому я понятия не имею, что происходит с vector.Also Проверка типов также не допускается.

Пример:

#include <iostream>
#include <vector>
using namespace std;
class A{
public:
void print(){cout << "greetings from A" << endl;}
};

class C : public A{
public:
void print(){cout << "greetings from C" << endl;}
};

class D : public A{
public:
void print(){cout << "greetings from D" << endl;}
};

class B : public A{
public:
void print(C* c){c->print();}
void print(A* d){d->print();}
};

int main()
{
D d;
C c;
B b;
vector<A*> a; //B,C,D will be stored inside a vector like this.
a.push_back(&c);
a.push_back(&d);
b.print(a[0]);
b.print(a[1]);
return 0;
}

Результат:

greetings from A
greetings from A

Желаемый результат:

greetings from C
greetings from A

0

Решение

Вам нужны виртуальные функции. декларирование A::print как виртуальный сделал бы так, чтобы вызов print на указатель типа A позвоню print из какого класса был создан объект, вместо того, чтобы использовать тип указателя, чтобы решить, что print звонить.

Вы также должны удалить D::print как вы ожидаете A::print вызывать, если объект имеет тип D

#include <iostream>
#include <vector>
using namespace std;
class A{
public:
virtual void print(){ cout << "This is printed twice." << endl; }
};

class C : public A{
public:
void print(){ cout << "This is desired output." << endl; }
};

class D : public A{

};

class B : public A{
public:
void print(C* c){ c->print(); }
void print(A* d){ d->print(); }
};

int main()
{
D d;
C c;
B b;
vector<A*> a; //B,C,D will be stored inside a vector like this.
a.push_back(&c);
a.push_back(&d);
b.print(a[0]);
b.print(a[1]);
return 0;
}

Результат:

This is desired output.
This is printed twice.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]