我很困惑......似乎這兩件事情都做同樣的事情。我覺得我很混淆名稱隱藏與功能覆蓋
在這第一個代碼中,我相信派生類隱藏了基類的函數名。
#include <iostream>
using namespace std;
class Quadrilateral {
public:
void greeting() {
std::cout << "i am a quadrilateral" << std::endl;
}
};
class Square : public Quadrilateral {
public:
void greeting() {
std::cout << "i am a square" << std::endl;
}
};
class Trapezoid : public Quadrilateral {
public:
void greeting() { //hides greeting from quadrilateral function
std::cout << "Hi I'm a Trapezoid" << std::endl;
}
};
int main()
{
Trapezoid tz;
tz.greeting();
}
這似乎有完全相同的結果:在這裏,他們被重寫,因爲它是虛擬的基類]
#include <iostream>
using namespace std;
class Quadrilateral {
public:
virtual void greeting() {
std::cout << "i am a quadrilateral" << std::endl;
}
};
class Square : public Quadrilateral {
public:
void greeting() {
std::cout << "i am a square" << std::endl;
}
};
class Trapezoid : public Quadrilateral {
public:
void greeting() { //hides greeting from quadrilateral function
std::cout << "Hi I'm a Trapezoid" << std::endl;
}
};
int main()
{
Trapezoid tz;
tz.greeting();
}
所以我想我來真的很迷茫。 ..有什麼不同?或者,如果它在這種情況下會產生相同的效果,那麼在基類中使它變爲虛擬的點是什麼?
第二並不能掩蓋它,但覆蓋它。 –
我知道,但它似乎做同樣的事情,無論你重寫或隱藏它。那麼有什麼意義呢? @LuchianGrigore – FrostyStraw
在這兩種情況下試試這個:製作派生類的實例。用基類的類型製作一個指針。調用基類指針(實際上指向派生類的實例)的函數。 – BoBTFish