Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
@InfiniteDissent gives an excellent explanation why such a feature would be problematic from a programming language design perspective. As a consequence, C++ is defined such that the code you wan...
Answer
#2: Post edited
- @InfiniteDissent gives an excellent explanation why such a feature would be problematic from a programming language design perspective. As a consequence, C++ is defined such that the code you wanted to write is no valid C++ code and thus compilers will reject it.
Although not directly addressed by the technical nature of your question, I would like to add an aspect about semantic aspects such interfaces: You expected this feature to be supported because, from your position, adding constness in a derived method is just an additional guarantee to the caller, and thus it seems safe to add this guarantee when overriding.- But, not modifying the object may in some cases actually mean a violation of the base class interface contract: Assume the base class method is defined such that calling it will bring the object to a defined state (for example, re-initializing it). Then a client holding an object of the base class type will, when calling that method, assume that the object will be brought to that state. If the overriding function, however, will not touch the object, this can mean a breach of this contract.
- I just mention this to make it clear that, also from an interface design point of view, adding constness for a derived method is not always "safe" but can result in a broken class hierarchy.
- @InfiniteDissent gives an excellent explanation why such a feature would be problematic from a programming language design perspective. As a consequence, C++ is defined such that the code you wanted to write is no valid C++ code and thus compilers will reject it.
- Although not directly addressed by the technical nature of your question, I would like to add an aspect about semantic aspects of such overriding scenarios: You expected this feature to be supported because, from your position, adding constness in a derived method is just an additional guarantee to the caller, and thus it seems safe to add this guarantee when overriding.
- But, not modifying the object may in some cases actually mean a violation of the base class interface contract: Assume the base class method is defined such that calling it will bring the object to a defined state (for example, re-initializing it). Then a client holding an object of the base class type will, when calling that method, assume that the object will be brought to that state. If the overriding function, however, will not touch the object, this can mean a breach of this contract.
- I just mention this to make it clear that, also from an interface design point of view, adding constness for a derived method is not always "safe" but can result in a broken class hierarchy.
#1: Initial revision
@InfiniteDissent gives an excellent explanation why such a feature would be problematic from a programming language design perspective. As a consequence, C++ is defined such that the code you wanted to write is no valid C++ code and thus compilers will reject it. Although not directly addressed by the technical nature of your question, I would like to add an aspect about semantic aspects such interfaces: You expected this feature to be supported because, from your position, adding constness in a derived method is just an additional guarantee to the caller, and thus it seems safe to add this guarantee when overriding. But, not modifying the object may in some cases actually mean a violation of the base class interface contract: Assume the base class method is defined such that calling it will bring the object to a defined state (for example, re-initializing it). Then a client holding an object of the base class type will, when calling that method, assume that the object will be brought to that state. If the overriding function, however, will not touch the object, this can mean a breach of this contract. I just mention this to make it clear that, also from an interface design point of view, adding constness for a derived method is not always "safe" but can result in a broken class hierarchy.