gpt4 book ai didi

c++ - 未调用继承的重写方法

转载 作者:行者123 更新时间:2023-11-28 02:29:03 27 4
gpt4 key购买 nike

为什么account类的operation方法中的depositmoney()方法调用的是account类的depositmoney(),而不是中的depositmoney() Sav_account 类?直接调用depositmoney() 方法调用子类的方法,这是显而易见的。但是不明白为什么 operations() 的间接调用没有给出预期的结果。

#include<iostream>
#include<conio.h>
#include<string>
using namespace std;
int temp = 0;

class account
{
protected:
string name;
double balance;
int AccNo;
public:
void operations()
{
int r = 0;
do{
cout << "1.DEPOSIT" << endl;
cout << "2.WITHDRAW" << endl;
cout << "3.CHECK BALANCE" << endl;
cout << "0.EXIT" << endl;
cin >> r;
switch(r)
{
case 1:this->depositmoney();
break;
case 2:this->withdraw();
break;
case 3:this->displaybalance();
break;
case 0:cout << "Exiting" << endl;
break;
default:
break;
}
}
while(r != 0);
}
account(string Name, double bal)
{
name = Name;
balance = bal;
AccNo = temp++;
}
void displaybalance()
{
cout << "name :" << name << endl;
cout << "A/C" << AccNo << endl;
cout << "your balance is " << balance << endl;
}
void depositmoney()
{
float deposit;
cout << "enter deposit" << endl;
cin >> deposit;
balance += deposit;
}
protected:
void withdraw()
{
float withdrawal;
cout << "enter witdrawal amount" << endl;
cin >> withdrawal;
if(balance >= withdrawal)
{
balance -= withdrawal;
}
else
{
cout << "insufficient funds" << endl;
}
}
};

class Sav_account :public account
{
private:
double const CI = 5;
void depositinterest()
{
balance += balance*CI / 100;
}
public:
Sav_account(string Name, double bal) :account(Name, bal)
{
AccType = 0;
}
void depositmoney()
{
account::depositmoney();
depositinterest();
}
};

void main()
{
Sav_account *account1 = new Sav_account("Shaw", 50000);
account1->operations();// DEPOSIT RESULTS IN NO INTEREST
account1->displaybalance();
account1->depositmoney(); // **DEPOSIT FUNCTION OF Sav_account CALLS interest function**
account1->displaybalance();
_getch();
}

最佳答案

你的类不是多态的。您没有多态函数,也没有覆盖任何东西。 (你有隐藏的功能)。因此,从 account 的函数调用 depositmoney(); 将调用 account::depositmoney()

要使类具有多态性,您需要使用虚函数。任何想要具有多态行为的函数都需要在基类中声明为 virtual,例如在此处的帐户中:

virtual void depositmoney() {

在派生类中,从C++11开始,你可以这样写:

void depositmoney() override
^^^^^^^^

如果您在尝试重写某个函数时不小心将其隐藏,则会导致编译器错误。 (尽管我猜测您使用的是不支持 C++11 的编译器,因为其中大多数也会拒绝 void main)。


此外,任何多态基类都应该有一个虚拟析构函数,即 virtual ~account() {} 否则代码 account *x = new Sav_account("Shaw", 50000); delete x; 会导致未定义的行为。

void main是非法的,main的返回类型必须是int

关于c++ - 未调用继承的重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490355/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com