下面程式輸出之結果為:
print from A
print from B
print from A
前兩行為 constructor 輸出,根據最後一行之輸出可以得出下列結論,當一個物件B被parent物件A 的指標指定時 (A* ptrA = &objB;),使用 (ptrA->y();) 會呼叫物件A的function (y();),若想呼叫物件B的function (y();),要在class A的定義中將 (void y();) 宣告成 (virtual void y();)。
所以,衍生物件呼叫哪一個function是由當下的變數所決定而不是只看宣告。
=================================
#include <iostream>
using namespace std;
class A
{
public:
A();
~A();
void y();
//virtual void y();
void print();
private:
};
A::A()
{
print();
}
A::~A()
{
}
void A::y()
{
this->print();
}
void A::print()
{
cout << "print from A" <<endl;
}
class B : public A
{
public:
B();
~B();
void y();
void print();
private:
};
B::B()
{
print();
}
B::~B()
{
}
void B::y()
{
this->print();
}
void B::print()
{
cout << "print from B" <<endl;
}
int main()
{
B objB;
A* ptrA = &objB;
ptrA->y();
return 0;
}
沒有留言:
張貼留言