带结构的隐式类型转换

时间:2014-11-26 20:51:55

标签: c++ types typecasting-operator

我是cplusplus的新手,我不知道如何做隐式类型 结构之间的转换。

我想做以下事情:

A a = new __A();
Object o = a;

我知道这需要运营商重载(我想?)然而,尝试着 实现运算符重载是徒劳的。我已经使用了本文中的示例:http://www.cplusplus.com/doc/tutorial/typecasting/但我无法使用任何东西。任何帮助都会非常 欣赏。这是我结构的布局。

typedef __Object* Object;
typedef __Class* Class;
typedef __String* String;
typedef __A* A;
typedef __Test002* Test002;

struct __Object {
  __Object_VT* __vptr;

  // The constructor.
  __Object();
  // The methods implemented by java.lang.Object.
  static int32_t hashCode(Object);
  static bool equals(Object, Object);
  static Class getClass(Object);
  static String toString(Object);

  // The function returning the class object representing
  // java.lang.Object.
  static Class __class();

  // The vtable for java.lang.Object.
  static __Object_VT __vtable;
};

struct __A { 
  __A_VT* __vptr;
  __A();
        static __String* toString(A);
        static int32_t hashCode(Object);
        static bool equals(Object, Object);
        static Class getClass(Object);

  static Class __class();

  static __A_VT __vtable;
};

2 个答案:

答案 0 :(得分:1)

关于您发布的代码和目标的一些事项

  • C ++通过继承为您处理虚拟方法调度,因此无需将虚拟表手动阻塞到您的类中
  • 正如其他人所说,您使用的是无效/保留标识符
  • 如果您正在创建一个单根的继承层次结构(如在Java中或添加类似反射支持的东西),那么您可能希望将Object类中的所有静态方法重构为虚拟或纯虚拟成员函数,具有类公开派生自Object类并覆盖这些方法
  • 你的用例在顶部意味着你真正想要的是能够拥有一个指向A类对象的指针使用类Object的接口:这又是由C ++中的公共继承启用的虚拟调度

所以可能类似以下

#include <string>

class Object
{
  /* ... */
  public:
    virtual ~Object() = default; // necessary to avoid slicing

    virtual std::string toString() const = 0;

  /* ... */
};

/* virtual inheritance necessary here if you plan on
   deriving from multiple classes that derive from Object;
   otherwise remove */
class A :  public virtual Object 
{
  /* ... */

  public:
    // may or may not be needed, viz., above
    // virtual ~A() = default;

    std::string toString() const override { return std::string{ "A" }; }

  /* ... */
};

#include <iostream>
#include <memory>

int main()
{
  std::unique_ptr<Object> o{ std::make_unique( A ) };
  std::cout << o->toString() << '\n'; // prints "A"
}

那里有很多东西,所以如果你对我写的任何内容感到困惑(尽管很可能会很快离开主题),就会提出问题。

答案 1 :(得分:0)

要使其工作,__A需要继承__Object,因为这是将指针指向前者的唯一方法。