Я знаю, что этот вопрос уже задан, но ни один из ответов, которые у меня пока не обнаружены, кажется достаточным. Я создаю вектор указателей на базовый класс и добавляю к нему всевозможные производные классы. Теперь базовый класс имеет виртуальную функцию, которая переопределяется во всех производных классах и уникальна для каждого из них. Поэтому, когда я просматриваю вектор и извлекаю эти объекты и вызываю функцию на этом объекте, мне нужно, чтобы он вызывал правильный, но все, что он будет делать, это вызвать версию базового класса. Я даже пытаюсь вернуть отдельные элементы в свой первоначальный класс, когда я извлекаю их из вектора, но они отказываются быть брошенными! напримерКастинг объектов в векторе в C++
vector<base*> myBase;
DerivedClass *myDerived = static_cast<DerivedClass> myBase[i];
Это не работает, несмотря на то, что все, что я читал, предполагает, что он должен. Мой отладчик говорит, что, несмотря на все это, myDerived по-прежнему имеет базу типов и вызывается версия моей виртуальной функции.
Любые идеи?
class BankAccount {
public:
BankAccount(string namein, string typein){
name = namein;
type = typein;
balance = 0;
}
virtual string getType();
virtual void printTransactions() = 0;
virtual int withdraw(double amt){
return getBalance() -amt;
}
};
class SavingsAccount: public BankAccount {
public:
SavingsAccount(string namein, string typein);
void addTransaction(string transType, string name);
virtual int withdraw(double amt);
void printTransactions();
virtual string getType();
private:
};
SavingsAccount::SavingsAccount(string namein, string typein): BankAccount(namein, typein) {
}
int SavingsAccount::withdraw(double amt){
double aBal = getBalance() - amt;
if (aBal > 0){
setBalance(aBal);
}
return getBalance() - amt;
}
class CheckingAccount: public SavingsAccount {
public:
CheckingAccount(string nameIn, string typein): SavingsAccount(nameIn, typein){
}
virtual int withdraw(double amt);
void printTransactions();
string getType(){
return "Checking";
}
};
int CheckingAccount::withdraw(double amtIn){
double newBal = getBalance() - amtIn;
if (newBal < 500.00 && newBal > 2.49) {
setBalance(newBal - 2.50);
}
return newBal;
}
int main(int argc, const char * argv[])
{
vector<BankAccount*> myAccts;
SavingsAccount *mySav;
CD *myCD;
CheckingAccount *myCheck;
switch (option) {
case 1: {
string name;
string type;
cout << "Enter name: ";
cin >> name;
getline(cin, dump);
cout << "Enter account type: ";
cin >> type;
getline(cin, dump);
if (type.compare("Checking") == 0) {
CheckingAccount myCheck1 = CheckingAccount(name, type);
myAccts.push_back(&myCheck1);
}
case 3:{
for (int x = 0; x < myAccts.size(); x++) {
if (myAccts[x]->getName() == name && myAccts[x]->getType() == type) {
if (type == "Savings") {
mySav = static_cast<SavingsAccount*>(myAccts[x]);
double y = mySav->withdraw(amt);
if (y < 0){
cout << "Insufficient funds!";
}
}
if (type == "Checking") {
myCheck = myAccts[x]->GetDerived();
double y = myCheck->withdraw(amt);
if (y < 0){
cout << "Insufficient funds!";
}
if (y < 497.5) {
cout << "Withdrawal fee: $ 2.50" << endl;
}
}
}
Проверка счета является дочерним сберегательный счет. Сожалею.
DerivedClass * myDerived = static_cast myBase [i]; –
radar
Использовать 'dynamic_cast' - лучше, чем' static_cast' –
динамический сброс возвращает Null – user3712524