一條C++問題

本帖最後由 luckiejacky 於 2015-5-15 14:09 編輯
  1. class A {
  2.    virtual void A() = 0;   
  3. }

  4. class B : public A {
  5.     std::string operator<<(const std::string& lhs);
  6. }

  7. std::string B::operator<<(const std::string& lhs) {
  8.      std::stringstream oss;
  9.      oss << lhs << "some text";
  10.      return oss.str();
  11. }

  12. In some caller,
  13. A* a = new A();
  14. cout << (B*) a << endl;
複製代碼


cout << (B*) a << endl;
點可以call 到
std::string B::operator<<(const std::string& lhs) ?
THX

cout << (B*) a << "\n";
咁得唔得?

TOP

補充,現在
cout << (B*) a << endl;
出個a variable個Address
而唔系D Text

KinChungE Ching:
好似一樣...
THX

TOP

1. Address-of operator (&)  的相反是什麼?
2. public:
3. cout 是什麼 type?
4. B::operator<< ( X lhs)- 用的時侯lhs 是在<<的右邊. operator function 不一定是 member function.

virtual void A() = 0;  和 拿個A去call B 的function的問題,  不想多說.

TOP

本帖最後由 luckiejacky 於 2015-5-15 16:44 編輯

聽過 << 這些operator 不一定是member function.

std::string operator<<(const std::string& str1, const std::string& str2);

downcast is not recommended?
THX

TOP

聽過
luckiejacky 發表於 2015-5-15 16:43


唔係not recommended, 係根本唔可以咁做
亂黎只會炒硬

如果你唔係Pointer, 一cast已經compile唔到

TOP

睇完堆code,完全唔知你想做乜……

首先,
  1. virtual void A() = 0;
複製代碼
到底係做緊乜?
首先佢作為一個Constructor唔可以return void,亦唔需要有return type
其次Constructor唔可以係virtual,更加唔可以係pure virtual
成段野根本過唔到Compilation
我當你寫abstract class,咁
  1. A* a = new A();
複製代碼
點可能成功?

其次,B係A既subclass,點可能由A轉做B?
  1. class Shape {
  2. ...
  3. }

  4. class Circle : public Shape {
  5. ...
  6. }
複製代碼
Circle係Shape,所以可以由Circle轉Shape;但Shape唔一定係Circle,點由Shape轉Circle?萬一我個Shape係Rectangle點算?
(RTTI唔計,似乎都唔建議用……)

第三,你要搞清楚你既operator<<到底用黎做乜
operator<<有兩種,一種係member function(take一個parameter),一種係普通function(take兩個parameter)
如果你要製作自己既ostream,就用member function
但如果你係要擴展現有既ostream(例如cout),e.g. 你想做
  1. cout << b <<endl;
複製代碼
而b係你自己既class
咁你應該寫一個咁樣既function:
  1. ostream& operator<<(ostream& os, B& b) {
  2.   // Do something with os and b, e.g.
  3.   // os << b.internal_value;
  4.   return os;
  5. }
複製代碼
之所以要return os,係因為通常operator<<都會連住用,例如cout << b << endl;
而實際上係做緊(cout << b) << endl;
(其實係
  1. operator<<(cout, b).operator<<(endl);
複製代碼
不過endl比較特殊,佢係一個function而唔係一段普通既string,我都係岩岩先知……)
所以你要return返一開始既ostream,比後面既endl繼續做落去

TOP