Quick Overview
Solution 3: The "Parallel Class Hierarchy" Software Design Pattern is your friend.
Long Extended Answer
Your design STARTED RIGHT. It can be optimized, some classes or members may be removed, but, the "parallel hierarchy" idea you are applying to solve a problem IS RIGHT.
Have deal with the same concept several times, usually in control hierarchies.
After a while, I ENDED DOING THE SAME SOLUTION THAN OTHER DEVELOPERS, that is called sometimes the "Parallel Hierarchy" Design Pattern or "Dual Hierarchy" Design Pattern.
(1) Have you ever split a single class into a single hierarchy of classes ?
(2) Have you ever split a single class into several classes, without a hierarchy ?
If you have applied these previous solutions, separately, then they are a way to solve some problems.
But, what if we combine these two solutions, simultaneously ?
Combine them, and, you'll get this "Design Pattern" .
Implementation
Now, let's apply the "Parallel Class Hierarchy" Software Design Pattern,
to your case.
You currently have 2 or more independent hierarchies of classes,
that are very similar, have similar associations or purpouse,
have similar properties or methods.
You wish to avoid having duplicated code or members ("consistency"),
yet, you can't merge this classes directly into a single one,
due to the differences among them.
So, your hierarchies are very similar to this figure,
but, yet, there are more than one:
................................................
...............+----------------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
...............+-------+--------+...............
...............| Common:: |...............
...............| Viewee |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Common:: |........| Common:: |..
..| Visual |........| Structural |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 1
In this, not yet certified, Design Pattern,
SEVERAL SIMILAR HIERARCHIES, ARE MERGED, INTO A SINGLE HIERARCHY,
and each shared or common class is extended by subclassing.
Note, that this solution is complex,
because you are already dealing with several hierarchies,
therefore is a complex scenario.
1 The Root Class
In each hierarchy there is a shared "root" class.
In your case, there is an independent "Composite" class,
for each hierarchy, that can have some similar properties,
and some similar methods.
Some of those member can be merged,
some of those members can not be merged.
So, what a developer can do, is to make a base root class,
and subclass the equivalent case for each hierarchy.
In Figure 2, you can see a diagram just for this class,
in which each class, keeps it namespace.
The members, are omitted, by now.
................................................
...............+-------+--------+...............
...............| Common:: |...............
...............| Composite |...............
...............+----------------+...............
...............| ... |...............
...............+-------+--------+...............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 2
As, you may note, each "Composite" classe is no longer in a separate hierarchy, but, merged into a single shared or common hierarchy.
Then, let's add the members, those that are the same,
can be move to the superclass, and those that are different,
to each base class.
And as you already know, "virtual" or "overloaded" methods are defined in the base class,
but, replaced in the subclasses. Like Figure 3.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Composite |.............
.............+--------------------+.............
.............| [+] void AddChild()|.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Composite |........| Composite |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 3
Note that there are maybe some classes without members,
and, you may be tempted to remove those classes,
DONT. They are called "Hollow Classes", "Enumerative Classes",
and other names.
2 The Subclasses
Let's go back to to the first diagram.
Each "Composite" class, had a "Viewee" subclass,
in each hierarchy.
The process is repeated for each class. Note than Figure 4,
the "Common::Viewee" class descend from the "Common::Composite",
but, for simplicity, the "Common::Composite" class is omitted,
from the diagram.
................................................
.............+--------------------+.............
.............| Common:: |.............
.............| Viewee |.............
.............+--------------------+.............
.............| ... |.............
.............+---------+----------+.............
.......................|........................
.......................^........................
....................../.\.......................
.....................+-+-+......................
.......................|........................
..........+------------+------------+...........
..........|.........................|...........
..+-------+--------+........+-------+--------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+----------------+........+----------------+..
..| ... |........| ... |..
..+----------------+........+----------------+..
................................................
Figure 4
You will note, that "Canvas::Viewee" and "SVG::Viewee",
DOES NOT LONGER descend from its respective "Composite",
but, from the common "Common::Viewee", instead.
You can add the members, now.
......................................................
.........+------------------------------+.............
.........| Common:: |.............
.........| Viewee |.............
.........+------------------------------+.............
.........| [+] bool Validate() |.............
.........| [+] Rect GetAbsoluteBounds() |.............
.........+-------------+----------------+.............
.......................|..............................
.......................^..............................
....................../.\.............................
.....................+-+-+............................
.......................|..............................
..........+------------+----------------+.............
..........|.............................|.............
..+-------+---------+........+----------+----------+..
..| Canvas:: |........| SVG:: |..
..| Viewee |........| Viewee |..
..+-----------------+........+---------------------+..
..| |........| [+] Viewee Element |..
..+-----------------+........+---------------------+..
..| [+] void Paint()|........| [+] void addChild() |..
..+-----------------+........+---------------------+..
......................................................
Figure 5
3 Repeat the Process
The process will continue, for each class,
"Canvas::Visual" will not descend from "Canvas::Viewee",
buit from "Commons::Visual",
"Canvas::Structural" will not descend from "Canvas::Viewee",
buit from "Commons::Structural", and so on.
4 The 3D Hierarchy Diagram
You will finish getting sort of a 3D diagram,
with several layers, the top layer, has the "Common" hierarchy
and the bottom layers, has each additional hierarchy.
Your original independent class hierarchies, where something similar to this (Figure 6) :
.................................................
..+-----------------+.......+-----------------+..
..| Common:: |.......| SVG:: |..
..| Composite |.......| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Viewee |.......| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Visual |.......| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+--------+--------+..
...........|.........................|...........
...........^.........................^...........
........../.\......................./.\..........
.........+-+-+.....................+-+-+.........
...........|.........................|...........
..+--------+--------+.......+--------+--------+..
..| Common:: |.......| SVG:: |..
..| Rect |.......| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 6
Note that some classes are omitted, and the whole "Canvas" hierarchy is omitted, for simplicitly.
The final integrated class hierarchy may be something similar to this:
.................................................
..+-----------------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Composite |...\+..| Composite |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Viewee |...\+..| Viewee |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Visual |...\+..| Visual |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+--------+--------+.......+-----------------+..
...........|.....................................
...........^.....................................
........../.\....................................
.........+-+-+...................................
...........|.....................................
..+--------+--------+.../+..+-----------------+..
..| Common:: +--<.+--+ SVG:: |..
..| Rect |...\+..| Rect |..
..+-----------------+.......+-----------------+..
..| ... |.......| ... |..
..+-----------------+.......+-----------------+..
.................................................
Figure 7
Note that some classes are omitted, and the whole "Canvas" classes are omitted, for simplicitly, but, will be similar to the "SVG" classes.
The "Common" classes could be represented as a single layer of a 3D diagram, the "SVG" classes in another layer, and the "Canvas" classes, in a third layer.
Check, that each layer is related to the first one,
in which, each class has a parent class of the "Common" hierarchy.
The code implementation may require to use either,
interface inheritance, class inheritance, or "mixins",
depending in what your Programming Language supports.
Summary
As any programming solution, do not rush into optimization, optimization is very important, yet, a bad optimization, may become a bigger problem, than the original problem.
I do not recommend apply either "Solution 1" or "Solution 2".
In "Solution 1" does not apply, because, the inheritance, is required in each case.
"Solution 2", "Mixins" may be applied, but, after designing the classes and hierarchies.
Mixins, are an alternative for interface-based inheritance,
or class-based multiple inheritance.
My proposed, Solution 3, is called sometimes the "Parallel Hierarchy" Design Pattern or "Dual Hierarchy" Design Pattern.
Many developers / designers won't agree with it, and believe it shouldn't exist. But, I have used by miself, and other developers, as a common solution for problems, like the one of your question.
Another missing thing. In your previous solutions, the main issue was not wheter to use "mixins" or "interfaces", but, to refine, first, the model of your classes, and later use an existing Programming Language feature.