A consensus by the "maximization of boilerplate" rule.
Inheritance is the most powerful tool available at the OOP land. It's the one thing that FP languages still didn't replace with enough added advantages to make the OOP stuff look like a toy. So if you are programming in OOP while avoiding inheritance, you would be certainly better in another paradigm.
(And, of course, powerful tools are easy to misuse. That's no reason for forbidding them.)
Assuming this is the case: why do you disagree and what do you think is the cause of this difference in opinion?
Also, C++ has abstract classes with only pure virtual functions, which accomplish the same thing.
- you have to at least implement the destructor if you are going to use the abstract class across multiple DLLs - else, dynamic_cast won't work since each DLL may have its own type_info object for the abstract class
- even if a method is marked abstract, it can still have a default implementation: https://gcc.godbolt.org/z/bAE7v6 though other prominent OO languages are slowly catching up with this ;)
The consensus is to use inheritance of interfaces and use composition to implement the interfaces.
Hence my phrasing: "Inheritance is better achieved through composition".