#include "stdafx.h"
#include <iostream>
#include <typeinfo> // typeid Header
class CBase
{
public:
CBase() {}
~CBase() {}
virtual void foo()
{
std::cout << "CBase!!!!!\n";
}
private:
CBase(const CBase& rhs) {}
CBase& operator= (const CBase& rhs) {}
};
class CDerived : public CBase
{
public:
CDerived() {}
~CDerived() {}
void foo()
{
std::cout << "CDerived!!!!!\n";
}
private:
CDerived(const CDerived& rhs) {}
CDerived& operator= (const CDerived& rhs) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
CBase *A = new CDerived;
std::cout << typeid(*A).name() << std::endl;
std::cout << typeid(A).name() << std::endl;
system("pause");
return 0;
}另外,一個類別裡若是有任一函數加上virtual,那該類別會在執行期時才會決定要調用哪一個類別函數,例如上面的:CBase *A = new CDerived;編譯時只會知道說A是宣告成CBase指標,雖然說new成CDerived,但因為CDerived繼承CBase,所以是沒問題的,所以此時若使用A->foo(),它是先指向CBase::foo(),等到執行期時,因foo()為virtual函數,此時就會去連結到CDerived::foo()(其實這牽扯到vtable的問題,不過這要說一堆東西,我懶!)。
以上其實用typeid來觀察就會很清楚了。
0 意見:
張貼留言