[操作疑難] C++ Virtual 問題

Rectangle 有無可能唔 Override draw 嘅情況下,
可以 Call 得到 Screen::drawShape(Rectangle*) ?

class Shape {
    public:
        virtual void draw ( Screen* scr ) {
              scr -> drawShape ( this );
       }
}

class Rectangle:public Shape { }

class Screen {
    public:
       void drawShape ( Shape *s ) {
            cout << "Draw Shape" ;
       }

       void drawShape ( Rectangle *r ) {
            cout  << "Draw Rectangle" ;
       }
}

既然佢係 virtual,
expect 唔只 1 個 inherit 啦。

做左type casting先?
KinChungE 發表於 2021-3-28 14:32

TOP

我自己認為呢個 design 係一個幾 common 嘅諗法

Shape:
   Rectangle
   Triangle
   Circle ...

Driver:
   GenericDriver
      CustomDriverA
      CustomDriverB

將來如果有人想整個 CustomDriverC
嘅話,佢可以唔洗改 Parents 嘅情況下,
自己 Overload 一個 implement。

TOP

我寫緊嘅 Library 其實就係爭呢樣嘢

https://github.com/ghostkcleung/tft_framework

TOP

我反如唔係好明, 如果個drawShape係專俾Rectangle用, 點解唔放去Rectangle class override draw(), 而要放 ...
KinChungE 發表於 2021-3-29 10:36


因為其實唔只 Rectangle 一個 Shape

TOP

咁咪每個shape既child class各自override
OO原意就係咁
響parent做哂child要做既野有D本末倒置 ...
KinChungE 發表於 2021-3-29 16:59


依家唯有係咁。

變咗每個 Child override 都係寫重複嘅嘢。

TOP

但都係分唔到 Type 。

有幾大重覆性先?

可否
draw() {
predraw();
drawSharp();
postdraw();
}

predraw(), postdraw()  ...
it_jobs 發表於 2021-3-30 10:00

TOP

本帖最後由 ghostkcleung 於 2021-3-31 19:41 編輯

原本個佈局大約係咁樣…

class Shape {
  void draw(Screen *scr) { scr->drawShape (this); }
  virtual void draw Generic(Screen *scr)=0;
};

class Rectangle : public Shape {
  void drawGeneric(Screen scr) {
     cout << "Rectangle" << end;
  }
}

class Circle : public Shape {
  void drawGeneric(Screen scr) {
     cout << "Circle" << end;
  }
}

class Screen {
  void drawShape(Shape *s) {
    s->drawGeneric(this);
  }
}

Class SubScreen {
  void drawShape(Rectangle *r){
     cout << "won't be called";
  }
}

TOP

本帖最後由 ghostkcleung 於 2021-3-30 22:02 編輯

我諗法係,將來如果有新嘅 Shape,
我唔須要搞個 Screen。
又如果我有新嘅 Screen,
對 Shape 有自己獨特嘅 draw 法,
可以直接 Override,
亦唔須要去搞啲 Shape。

但依家無辦法做呢樣嘢。

TOP

我個諗法係每個 Shape define 出嚟嗰陣,
有自己嘅 Generic 方法處理 Draw。

當 Screen 無自己方法處理呢個 Shape 嗰陣,
就會用 Shape 嘅 Generic;

如果將來有新嘅 Screen,
對 Shape 有自己獨特處理方法,
亦有自己嘅 Override Draw。

TOP