У меня есть 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
Вам нужны виртуальные функции. декларирование 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.
Других решений пока нет …