reimplementing an interface in a derived class

bauss jj_1337 at live.dk
Fri Jan 4 09:30:32 UTC 2019


On Friday, 4 January 2019 at 08:40:04 UTC, Alex wrote:
> On Friday, 4 January 2019 at 02:13:27 UTC, Neia Neutuladh wrote:
>> I can't think of a single class system that works like that. 
>> C++, Java, C#, Dart, and TypeScript all work like D here. 
>> GObject in C works like D.
>
> In the example below, the "2" of B.foo is printed only once. 
> Independently of the cast type, after degrading a B to an A the 
> degraded object behaves like an A.
>
> ´´´ C++ ´´´
> #include <iostream>
> class A
> {
> public:
>     int foo(){return 1;}
> };
> class B : public A
> {
> public:
>     int foo(){return 2;}
> };
>
> void performFoo(A *a)
> {
>     std::cout << a->foo() << std::endl;
> }
>
> int main() {
>     auto a = new A();
>     auto b = new B();
>     std::cout << a->foo() << std::endl;
>     std::cout << b->foo() << std::endl;
>     std::cout << dynamic_cast<A*>(b)->foo() << std::endl;
>     std::cout << static_cast<A*>(b)->foo() << std::endl;
>     std::cout << reinterpret_cast<A*>(b)->foo() << std::endl;
>     performFoo(a);
>     performFoo(b);
>     return 0;
> }
> ´´´
>> The point of OOP is that a bundle of data has particular ways 
>> of dealing with it. B has different data (at least 
>> theoretically), and that data has different ways of working 
>> with it. So if casting to a base class changed something to 
>> use the base class's behavior, you'd get bugs almost anywhere 
>> you used inheritance, since the derived class's data isn't 
>> being modified properly.
>
> Now I have the feeling, I'm missing something elementary... 
> sorry for this...
> But take the classic example of OOP of an Animal and a Dog: 
> Animal.
> Let the animal implement some default move and eat behavior.
> Let the dog override the move method and implement bark.
> If you degrade the dog to the animal by casting it should still 
> be able to move and eat, but not bark.
>
> This should always be true for inherited objects as the base 
> classes define enough content to manage proper behavior of 
> their own. (Given they are not abstract, a function is not 
> virtual and so on...)

Your C++ example is not the same as in D because in C++ functions 
aren't virtual by default, they are in D.

Mark your functions as virtual in your C++ example and see what 
happens.

All functions in D are virtual by default!


More information about the Digitalmars-d-learn mailing list