The first solution that you describe is the best if you want to maintain data integrity, and if you have relatively few product types and rarely add new product types. This is the design that I would choose in your situation. Reporting is only difficult if your reports require product-specific attributes. If your reports only need attributes in a common product table, that’s fine.
The second solution you described is called Polymorphic Associations, and that’s not good. Your "foreign key" is not a real foreign key, so you cannot use the DRI constraint to ensure data integrity. OO polymorphism has no counterpart in the relational model.
The third solution that you describe, including storing the attribute name as a string, is a project called Entity-Attribute-Value, and you can say that it is a painful and expensive solution. There is no way to guarantee data integrity, in no way to make one NOT NULL attribute, without being able to verify that this product has a specific set of attributes. It is not possible to limit a single attribute to a lookup table. Many types of aggregate queries become impossible in SQL, so you need to write a lot of application code for reporting. Use the EAV design only if you need it, for example, if you have an unlimited number of product types, the list of attributes may differ for each line, and your schema should often post new product types without changing the code or schema.
Another solution is "one-way inheritance." It uses an extremely wide table with a column for each attribute of each product. Leave NULL in columns that are not related to the product in the given row. This means that you cannot declare an attribute as NOT NULL (unless it is common to all products). In addition, most RDBMS products have a limit on the number of columns in a single table or the total width in bytes of a row. Thus, you are limited by the number of types of products that you can present in this way.
There are hybrid solutions, for example, you can usually store common attributes in columns, but product-specific attributes in the attribute-attribute-value table. Or you can store product-specific attributes in some other way, such as XML or YAML, in the BLOB column of the Products table. But these hybrid solutions suffer because some attributes need to be retrieved differently now.
The ultimate solution for these situations is to use a semantic data model using RDF instead of a relational database. It has some characteristics with EAV, but it is much more ambitious. All metadata is stored in the same way as data, so each object is self-describing, and you can request a list of attributes for this product in the same way as requesting data. There are special products such as Jena or Sesame , an implementation of this data model, and a special query language other than SQL.