اشکال در استفاده از وکتور - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

اشکال در استفاده از وکتور

0 امتیاز

من اگه داخل کد زیر بخوام به توابعی که مخصوص دوکلاس مشتق شده از کلاس account هستند دسترسی پیدا کنم چکار کنم.چون من یک وکتور از نوع کلاس account میسازم.بعد دو شی از کلاس های savingaccount و checkingaccount رو داخل این وکتور push_back میکنم.حالا میخام مثلا به تابع calculateInterest از کلاس savingaccount دسترسی داشته باشم از طریق این وکتور چکار باید بکنم.

class Account
{
protected:
	double current_stock;
public:
	Account();
	Account(double);
	virtual void credit(double );
	virtual bool debit(double);
	double getBalance();
	
};
///////////////////////
#pragma once
#include "account.h"
class SavingAccount :
	public  Account
{
private:
	double rate_interest;
public:
	SavingAccount();
	SavingAccount(double,double);
	double calculateInterest();

};
//////////////////
#pragma once
#include "account.h"
class CheckingAccount :
	public Account
{
private:
	double expense;
public:
	CheckingAccount();
	CheckingAccount(double,double);
	void credit(double);
	bool debit(double);
}
////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
SavingAccount SA(100000,.25);
	CheckingAccount Ch(200000,500);
	vector <Account> instanc;
	instanc.push_back(SA);
	instanc.push_back(Ch);
	double sood=instanc[0].calculateInterest();//khata mide.
	instanc[0].credit(sood);
	return 0;
}

 

سوال شده خرداد 10, 1393  بوسیله ی maryam (امتیاز 338)   12 33 44
دوباره تگ گذاری شد مهر 9, 1393 بوسیله ی BlueBlade

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

کدی که نوشتی مشکل  slicing داره یعنی وقتی کلاس child رو به parent تبدیل می کنی اگر نوعش pointer نباشه چیزایی که توی parent تعریف نشدن از دست میرن .

اگر بصورت پوینتر هم بخوای ذخیره کنی برای صدا زدن توابع باید قبلش از dynamic_cast استفاده کنی و نوع parent رو به child تغیییر بدی بعد تابع رو صدا بزنی.(البته صدا زدن Credit , debit چون virtual هستن اشکالی نداره )

http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c

#include <iostream>
#include <memory>
#include <vector>
using namespace std;

struct Base
{
    virtual void foo()
    {
        cout<<"In parent\n";
    }
};

struct Child1:public Base
{
    void foo()
    {
        cout<<"In Child1\n";
    }
    void bar(){
         cout<<"In Child1 Bar \n";
    }
};
struct Child2 : public Base
{
    void foo()
    {
        cout<<"In Child2\n";
    }
};

int main()
{
    Child1* ch1=new Child1;
    Child2* ch2=new Child2;

    std::vector<Base*> vec;
    vec.push_back(ch1);
    vec.push_back(ch2);

    vec[0]->foo();//khorooji: In child 1

    Child1* ch=dynamic_cast<Child1*>(vec[0]);
    ch->bar(); // khorooji : In child1 Bar

    vec[1]->foo();//khorooji : In child2
}

 

اجرای زنده 

پاسخ داده شده خرداد 12, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد خرداد 13, 1393 بوسیله ی maryam
...