5

I want to specifically invoke the base class method; what's the most concise way to do this? For example:

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; } }; 
5
  • And also is the way I'm doing it considered a "standard"? e.g. will it work on any compilers? Commented Mar 12, 2010 at 17:39
  • KISS: keep it simple... Add is_equal function to the base class and use it in the child class. Commented Mar 12, 2010 at 17:40
  • 1
    @AlexKR: thanks for the suggestion. Though, I have a real reason why I have to use these operators..=( Commented Mar 12, 2010 at 17:45
  • 2
    The operator!= should be a const method, and take const parameters. Commented Mar 12, 2010 at 18:04
  • 1
    @KennyTM: thanks for the info. I intentionally left those out just to get the post up quickly. =) Commented Mar 12, 2010 at 20:14

5 Answers 5

8

No, that is as concise as it gets. Base::operator!= is the name of the method.

And yes, what you are doing is standard.

However, in your example (unless you have removed some code), you do not need Child::operator!= at all. It does the same thing as Base::operator!= will.

Sign up to request clarification or add additional context in comments.

1 Comment

@Andrew: thanks for the remark. Though, as you have guessed, I did remove some code just to simplify the question. =)
5

1

if ( *((Base*)this) != child_ ) return true; 

2

if ( *(static_cast<Base*>(this)) != child_ ) return true; 

3

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

1 Comment

Careful! This only works because you are calling non-virtual functions!
4

What you're doing is the most concise and "standard" way to do it, but some people prefer this:

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; } }; 

The benefits of this method is that it clarifies intention, it gives you a standard abbreviation for what could be a long base-class name, and if your base class changes, you don't have to change every use of the base.

See Using "super" in C++ for additional discussion.

(Personally, I don't care for this, and I don't recommend it, but I think it is one valid answer to the question.)

1 Comment

+1 for mentioning this: "... and if your base class changes, you don't have to change every use of the base." Thanks!
0
if (condition) return true; return false; 

can be abbreviated to

return condition; 

Comments

-2

I'd get rid of the if/then control structure and just return the return value of the base class operator, but otherwise what you're doing is fine.

It can be a bit more concise, though: return ((Base&)*this) != child_;

1 Comment

If he's going to do that, he may as well just get rid of the function altogether, and let the base class be called. I think it's clear that the "Some other comparisons" section should be filled in with code.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.