未调用继承的重写方法
Inherited overridden method not being called
为什么账户类操作方法中的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
,例如在account
中:
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
。
类中没有任何重写的方法;你还没有做过virtual
。
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- 具有引用返回类型的重写方法上的协变返回类型无效
- 调用不是来自直系父亲的重写方法
- Qt/C++ - 从派生类调用重写方法
- 重写方法优先 C++
- 为什么重写方法并将 const 添加到参数类型有效
- 如何在向量上调用不同的重写方法
- 处理C++中基类的重写方法的异常
- C重写C++方法
- 如何自动更新重写方法的 *this 返回类型
- 在 c++ 中具有不同返回类型的重写方法
- 未调用继承的重写方法
- 只有当类重写方法时,在动态加载的共享库中实例化的类才会丢失XCode 4.3/4.4 typeinfo
- 在构造函数中使用重写方法的替代方法,Java
- 使用父类型时重写C++方法
- 多个线程中的重写方法
- 关于在强制转换为子类的超类时调用其重写方法
- 如何在所有派生类中调用重写方法
- 返回对"this"的取消引用的重写方法
- C++-从方法基类调用派生类中的重写方法