2010-03-12 40 views
4

我想專門調用基類方法;最簡單的方法是什麼?例如:簡明(但仍然有表現力)調用基類方法的C++語法

class Base 
{ 
public: 
    bool operator != (Base&); 
}; 

class Child : public Base 
{ 
public: 
    bool operator != (Child& child_) 
    { 
    if(Base::operator!=(child_)) // Is there a more concise syntax than this? 
     return true; 

    // ... Some other comparisons that Base does not know about ... 

    return false; 
    } 
}; 
+0

,也是我正在做它認爲的方式一個「標準」?例如它可以在任何編譯器上工作嗎? – sivabudh 2010-03-12 17:39:25

+0

KISS:保持簡單...將is_equal函數添加到基類並在子類中使用它。 – alexkr 2010-03-12 17:40:55

+0

@AlexKR:謝謝你的建議。雖然,我有一個真正的原因,爲什麼我必須使用這些操作符.. =( – sivabudh 2010-03-12 17:45:19

回答

8

不,這是儘可能簡明。 Base::operator!=是方法的名稱。

是的,你在做什麼是標準的。

但是,在你的例子中(除非你刪除了一些代碼),你完全不需要Child::operator!=。它的作用與Base::operator!=相同。

+0

@安德魯:謝謝你的評論。不過,正如你所猜測的那樣,我的確刪除了一些代碼來簡化問題。 =) – sivabudh 2010-03-12 17:51:01

5
if (*((Base*)this) != child_) return true; 
if (*(static_cast<Base*>(this)) != child_) return true; 
class Base 
{ 
public: 
    bool operator != (Base&); 
    Base  & getBase()  { return *this;} 
    Base const & getBase() const { return *this;} 
}; 

if (getBase() != child_) return true; 
+0

感謝您展示更多方法來實現我所問的內容。 ;-) – sivabudh 2010-03-12 17:50:14

+0

小心!這隻適用於你正在調用非虛函數! – 2010-03-12 19:57:34

1
if (condition) return true; 
return false; 

可以縮寫爲

return condition; 
-1

我擺脫了if/then控制結構,只是返回基類操作符的返回值,但否則你所做的很好。

它可以更簡潔一點,雖然:return ((Base&)*this) != child_;

+0

如果他打算這樣做,他可能完全擺脫這個函數,並且讓基類被調用。我認爲很明顯,「其他比較」部分應該填入代碼。 – 2010-03-12 18:06:12

3

你在做什麼是最簡潔和「標準」的方式做到這一點,但有些人喜歡這樣的:

class SomeBase 
{ 
public: 
    bool operator!=(const SomeBaseClass& other); 
}; 

class SomeObject: public SomeBase 
{ 
    typedef SomeBase base; // Define alias for base class 

public: 
    bool operator!=(const SomeObject &other) 
    { 
     // Use alias 
     if (base::operator!=(other)) 
      return true; 

     // ... 

     return false; 
    } 
}; 

這種方法的好處在於它可以闡明意圖,它爲您提供了一個標準的縮寫,可以是一個長的基類名稱,如果您的基類發生更改,則不必更改基類的所有用法。

請參閱Using "super" in C++進行其他討論。

(就個人而言,我不關心這個,我不建議這樣做,但我認爲這是一個有效的問題的答案。)

+0

+1提到這一點:「......如果你的基類發生了變化,你不必改變基地的每一次使用。」謝謝! – sivabudh 2010-03-12 20:15:35

相關問題