2014年4月10日 星期四

C++ 繼承物件之 (virtual) 函數呼叫

下面程式輸出之結果為:
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;
}

沒有留言:

張貼留言