未被调用的继承重写方法

时间:2015-04-07 11:20:07

标签: c++ polymorphism

为什么帐户类的操作方法中的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(); } 的间接呼叫没有给出预期的结果。

{{1}}

2 个答案:

答案 0 :(得分:1)

你的类中不是任何重写的方法;你没有制作任何virtual

答案 1 :(得分:1)

你的课程不是多态的。您没有多态函数,也没有覆盖任何内容。 (你有隐藏的功能)。因此,从depositmoney();函数调用account将调用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