天天看點

C++筆記 19.2 運作時類型識别primer C++筆記

primer C++筆記

運作時類型識别

C++筆記 19.2 運作時類型識别primer C++筆記

dynamic_cast運算符

C++筆記 19.2 運作時類型識别primer C++筆記

指針類型的dynamic_cast

C++筆記 19.2 運作時類型識别primer C++筆記

引用類型的dynamic_cast

C++筆記 19.2 運作時類型識别primer C++筆記

typeid運算符

C++筆記 19.2 運作時類型識别primer C++筆記

使用typeid運算符

//vs2017
//Base不含虛函數:
typeid(*bp) : class Base
typeid(*dp) : class Derived

typeid(bp) : class Base *
typeid(dp) : class Derived *

//Base含虛函數時:
typeid(*bp) : class Derived
typeid(*dp) : class Derived

typeid(bp) : class Base *
typeid(dp) : class Derived *
           
C++筆記 19.2 運作時類型識别primer C++筆記
C++筆記 19.2 運作時類型識别primer C++筆記
C++筆記 19.2 運作時類型識别primer C++筆記

使用RTTI

C++筆記 19.2 運作時類型識别primer C++筆記
class Base
{
	friend bool operator==(const Base&, const Base&);

protected:
	virtual bool equal(const Base&) const;
};

class Derived : public Base
{
protected:
	virtual bool equal(const Base&) const;
};

//整體的相等運算符
bool operator==(const Base &lhs, const Base &rhs)
{
	return typeid(lhs) == typeid(rhs) && lhs.equal(rhs);
}

bool Derived::equal(const Base & rhs) const
{
	auto r = dynamic_cast<const Derived &>(rhs);
	//執行比較Derived對象的操作
	cout << "Derived::equal exec()" << endl;
}

bool Base::equal(const Base & rhs) const
{
	//執行比較Base對象的操作
	cout << "Base::equal exec()" << endl;
}
           

type_info類

C++筆記 19.2 運作時類型識别primer C++筆記
C++筆記 19.2 運作時類型識别primer C++筆記
C++筆記 19.2 運作時類型識别primer C++筆記