diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index cdcd389118859866f8bae91541dac2453af57bc1..8e9ba22bb78f5c034c054c69cb3eede9837e76f1 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -320,102 +320,36 @@ bool Symbol::isPrivate() const
 { return _visibility == Private; }
 
 bool Symbol::isScopedSymbol() const
-{ return dynamic_cast<const ScopedSymbol *>(this) != 0; }
+{ return asScopedSymbol() != 0; }
 
 bool Symbol::isEnum() const
-{ return dynamic_cast<const Enum *>(this) != 0; }
+{ return asEnum()  != 0; }
 
 bool Symbol::isFunction() const
-{ return dynamic_cast<const Function *>(this) != 0; }
+{ return asFunction() != 0; }
 
 bool Symbol::isNamespace() const
-{ return dynamic_cast<const Namespace *>(this) != 0; }
+{ return asNamespace() != 0; }
 
 bool Symbol::isClass() const
-{ return dynamic_cast<const Class *>(this) != 0; }
+{ return asClass() != 0; }
 
 bool Symbol::isBlock() const
-{ return dynamic_cast<const Block *>(this) != 0; }
+{ return asBlock() != 0; }
 
 bool Symbol::isUsingNamespaceDirective() const
-{ return dynamic_cast<const UsingNamespaceDirective *>(this) != 0; }
+{ return asUsingNamespaceDirective() != 0; }
 
 bool Symbol::isUsingDeclaration() const
-{ return dynamic_cast<const UsingDeclaration *>(this) != 0; }
+{ return asUsingDeclaration() != 0; }
 
 bool Symbol::isDeclaration() const
-{ return dynamic_cast<const Declaration *>(this) != 0; }
+{ return asDeclaration() != 0; }
 
 bool Symbol::isArgument() const
-{ return dynamic_cast<const Argument *>(this) != 0; }
+{ return asArgument() != 0; }
 
 bool Symbol::isBaseClass() const
-{ return dynamic_cast<const BaseClass *>(this) != 0; }
-
-const ScopedSymbol *Symbol::asScopedSymbol() const
-{ return dynamic_cast<const ScopedSymbol *>(this); }
-
-const Enum *Symbol::asEnum() const
-{ return dynamic_cast<const Enum *>(this); }
-
-const Function *Symbol::asFunction() const
-{ return dynamic_cast<const Function *>(this); }
-
-const Namespace *Symbol::asNamespace() const
-{ return dynamic_cast<const Namespace *>(this); }
-
-const Class *Symbol::asClass() const
-{ return dynamic_cast<const Class *>(this); }
-
-const Block *Symbol::asBlock() const
-{ return dynamic_cast<const Block *>(this); }
-
-const UsingNamespaceDirective *Symbol::asUsingNamespaceDirective() const
-{ return dynamic_cast<const UsingNamespaceDirective *>(this); }
-
-const UsingDeclaration *Symbol::asUsingDeclaration() const
-{ return dynamic_cast<const UsingDeclaration *>(this); }
-
-const Declaration *Symbol::asDeclaration() const
-{ return dynamic_cast<const Declaration *>(this); }
-
-const Argument *Symbol::asArgument() const
-{ return dynamic_cast<const Argument *>(this); }
-
-const BaseClass *Symbol::asBaseClass() const
-{ return dynamic_cast<const BaseClass *>(this); }
-
-ScopedSymbol *Symbol::asScopedSymbol()
-{ return dynamic_cast<ScopedSymbol *>(this); }
-
-Enum *Symbol::asEnum()
-{ return dynamic_cast<Enum *>(this); }
-
-Function *Symbol::asFunction()
-{ return dynamic_cast<Function *>(this); }
-
-Namespace *Symbol::asNamespace()
-{ return dynamic_cast<Namespace *>(this); }
-
-Class *Symbol::asClass()
-{ return dynamic_cast<Class *>(this); }
-
-Block *Symbol::asBlock()
-{ return dynamic_cast<Block *>(this); }
-
-UsingNamespaceDirective *Symbol::asUsingNamespaceDirective()
-{ return dynamic_cast<UsingNamespaceDirective *>(this); }
-
-UsingDeclaration *Symbol::asUsingDeclaration()
-{ return dynamic_cast<UsingDeclaration *>(this); }
-
-Declaration *Symbol::asDeclaration()
-{ return dynamic_cast<Declaration *>(this); }
-
-Argument *Symbol::asArgument()
-{ return dynamic_cast<Argument *>(this); }
-
-BaseClass *Symbol::asBaseClass()
-{ return dynamic_cast<BaseClass *>(this); }
+{ return asBaseClass() != 0; }
 
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index e9d150e8d5e7be431771c0202458b698be771e38..2b9a428dce9bcad49254692afad2e7cb4cafb0cc 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -197,29 +197,29 @@ public:
     /// Returns true if this Symbol is a BaseClass.
     bool isBaseClass() const;
 
-    const ScopedSymbol *asScopedSymbol() const;
-    const Enum *asEnum() const;
-    const Function *asFunction() const;
-    const Namespace *asNamespace() const;
-    const Class *asClass() const;
-    const Block *asBlock() const;
-    const UsingNamespaceDirective *asUsingNamespaceDirective() const;
-    const UsingDeclaration *asUsingDeclaration() const;
-    const Declaration *asDeclaration() const;
-    const Argument *asArgument() const;
-    const BaseClass *asBaseClass() const;
-
-    ScopedSymbol *asScopedSymbol();
-    Enum *asEnum();
-    Function *asFunction();
-    Namespace *asNamespace();
-    Class *asClass();
-    Block *asBlock();
-    UsingNamespaceDirective *asUsingNamespaceDirective();
-    UsingDeclaration *asUsingDeclaration();
-    Declaration *asDeclaration();
-    Argument *asArgument();
-    BaseClass *asBaseClass();
+    virtual const ScopedSymbol *asScopedSymbol() const { return 0; }
+    virtual const Enum *asEnum() const { return 0; }
+    virtual const Function *asFunction() const { return 0; }
+    virtual const Namespace *asNamespace() const { return 0; }
+    virtual const Class *asClass() const { return 0; }
+    virtual const Block *asBlock() const { return 0; }
+    virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const { return 0; }
+    virtual const UsingDeclaration *asUsingDeclaration() const { return 0; }
+    virtual const Declaration *asDeclaration() const { return 0; }
+    virtual const Argument *asArgument() const { return 0; }
+    virtual const BaseClass *asBaseClass() const { return 0; }
+
+    virtual ScopedSymbol *asScopedSymbol() { return 0; }
+    virtual Enum *asEnum() { return 0; }
+    virtual Function *asFunction() { return 0; }
+    virtual Namespace *asNamespace() { return 0; }
+    virtual Class *asClass() { return 0; }
+    virtual Block *asBlock() { return 0; }
+    virtual UsingNamespaceDirective *asUsingNamespaceDirective() { return 0; }
+    virtual UsingDeclaration *asUsingDeclaration() { return 0; }
+    virtual Declaration *asDeclaration() { return 0; }
+    virtual Argument *asArgument() { return 0; }
+    virtual BaseClass *asBaseClass() { return 0; }
 
     /// Returns this Symbol's type.
     virtual FullySpecifiedType type() const = 0;
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index c69483a2519f99cb3cb9fcd68ca26ea0acbba3ac..c7b3e924b4fe6b277b8fd98281bfc1c0091a2a9b 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -71,6 +71,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const UsingNamespaceDirective *asUsingNamespaceDirective() const
+    { return this; }
+
+    virtual UsingNamespaceDirective *asUsingNamespaceDirective()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 };
@@ -84,6 +90,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const UsingDeclaration *asUsingDeclaration() const
+    { return this; }
+
+    virtual UsingDeclaration *asUsingDeclaration()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 };
@@ -105,6 +117,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const Declaration *asDeclaration() const
+    { return this; }
+
+    virtual Declaration *asDeclaration()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 
@@ -127,6 +145,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const Argument *asArgument() const
+    { return this; }
+
+    virtual Argument *asArgument()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 
@@ -146,6 +170,12 @@ public:
     Scope *members() const;
     void addMember(Symbol *member);
 
+    virtual const ScopedSymbol *asScopedSymbol() const
+    { return this; }
+
+    virtual ScopedSymbol *asScopedSymbol()
+    { return this; }
+
 private:
     Scope *_members;
 };
@@ -159,6 +189,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const Block *asBlock() const
+    { return this; }
+
+    virtual Block *asBlock()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 };
@@ -175,6 +211,12 @@ public:
     // Type's interface
     virtual bool isEqualTo(const Type *other) const;
 
+    virtual const Enum *asEnum() const
+    { return this; }
+
+    virtual Enum *asEnum()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
     virtual void accept0(TypeVisitor *visitor);
@@ -230,6 +272,12 @@ public:
     // Type's interface
     virtual bool isEqualTo(const Type *other) const;
 
+    virtual const Function *asFunction() const
+    { return this; }
+
+    virtual Function *asFunction()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
     virtual void accept0(TypeVisitor *visitor);
@@ -264,6 +312,12 @@ public:
     // Type's interface
     virtual bool isEqualTo(const Type *other) const;
 
+    virtual const Namespace *asNamespace() const
+    { return this; }
+
+    virtual Namespace *asNamespace()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
     virtual void accept0(TypeVisitor *visitor);
@@ -281,6 +335,12 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
+    virtual const BaseClass *asBaseClass() const
+    { return this; }
+
+    virtual BaseClass *asBaseClass()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
 
@@ -322,6 +382,12 @@ public:
     // Type's interface
     virtual bool isEqualTo(const Type *other) const;
 
+    virtual const Class *asClass() const
+    { return this; }
+
+    virtual Class *asClass()
+    { return this; }
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
     virtual void accept0(TypeVisitor *visitor);