C++ 多态公有继承

本文展示了C++中如何通过公有继承和虚函数实现多态性。Brass类作为基类,定义了基本的银行账户操作,如Deposit和Withdraw,而BrassPlus类作为派生类,扩展了这些功能并添加了额外的属性和行为。Withdraw和ViewAcct方法在基类和派生类中被重新定义,展示不同的行为,体现了多态性。在main函数中,创建了基类和派生类的对象,并调用它们的方法来演示多态效果。
摘要由CSDN通过智能技术生成

多态公有继承

有两种重要的机制可用于实现多态公有继承

  • 在派生类中重新定义基类的方法
  • 使用虚方法
#ifndef __TEST_2_H_
#define __TEST_2_H_
#include <iostream>
#include<string>
using namespace std;
typedef unsigned int uint;

class Brass
{
    private:
        string fullname;
        long acctNum;
        double balance;
    public:
        Brass(const string & s = "Nullbody",long an = -1,double bal = 0.0);
        void Deposit(double amt);
        virtual void Withdraw(double amt);
        double Balance()const;
        virtual void ViewAcct()const;
        virtual ~Brass(){}
};

class BrassPlus : public Brass
{
    private:
        double maxLoan;
        double rate;
        double owesBank;
    public:
        BrassPlus(const string & s = "Nullbody",long an = -1,
                    double bal = 0.0,double ml = 500,double r = 0.11125);
        BrassPlus(const Brass & ba,double ml = 500,double r = 0.11125);
        virtual void ViewAcct()const;
        virtual void Withdraw(double amt);
        void ResetMax(double m){maxLoan = m;}
        void ResetRate(double r){rate = r;}
        void ResetOwes(){owesBank = 0;}
};

#endif
  • Brass类和BrassPlus类都声明了ViewAcct()和Withdraw()方法,但它们的这些方法的行为是不同的
  • 使用关键词virtual声明虚函数
#include"test_2.h"

typedef std::ios_base::fmtflags format;
typedef std::streamsize precis;

format setFormat();
void restore(format f,precis p);

Brass::Brass(const string & s,long an,double bal)
{
    fullname = s;
    acctNum = an;
    balance = bal;
}

void Brass::Deposit(double amt)
{
    if(amt < 0)
        cout << "Negative deposit not allowed; "
            << "deposit is cancelled\n";
    else
        balance += amt;
}

void Brass::Withdraw(double amt)
{
    format initialState = setFormat();
    precis prec = cout.precision(2);

    if(amt < 0)
        cout << "in withdraw\n";
    else if(amt <= balance)
        balance -= amt;
    else
        cout << "amt = " << amt << "\n";
    restore(initialState,prec);
}

double Brass::Balance()const
{
    return balance;
}

void Brass::ViewAcct()const
{
    format initialState = setFormat();
    precis prec = cout.precision(2);
    cout << "fullname = " << fullname << "\n";
    cout << "balance = " << balance << "\n";
    restore(initialState,prec);

}


BrassPlus::BrassPlus(const string & s,long an,
                    double bal,double ml,double r):Brass(s,an,bal)
{
    maxLoan = ml;
    owesBank = 0.0;
    rate = r;
}

BrassPlus::BrassPlus(const Brass & ba,double ml,double r):Brass(ba)
{
    maxLoan = ml;
    owesBank = 0.0;
    rate = r;
}

void BrassPlus::ViewAcct()const
{
    format initialState = setFormat();
    precis prec = cout.precision(2);

    Brass::ViewAcct();
    cout << "maxLoan = " << maxLoan << "\n";
    cout << "owesBank = " << owesBank << "\n";
    cout.precision(3);
    restore(initialState,prec);

}

void BrassPlus::Withdraw(double amt)
{
    format initialState = setFormat();
    precis prec = cout.precision(2);

    double bal = Balance();
    if(amt <= bal)
        Brass::Withdraw(amt);
    else
        cout << "quit withdraw\n";
    restore(initialState,prec);
}

format setFormat()
{
    return cout.setf(std::ios_base::fixed,std::ios_base::floatfield);
}

void restore(format f,precis p)
{
    cout.setf(f,std::ios_base::floatfield);
    cout.precision(p);
}
#include "test_2.h"

int main()
{
    Brass Piggy("Porcelot Piggy",381299,4000.00);
    BrassPlus Hoggy("Horatio Hogg",382288,3000.00);
    Piggy.ViewAcct();
    Hoggy.ViewAcct();
    
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃秃秃秃哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值