如何创建我的摘要 class 的无名派生对象 class?

How to create object of nameless derived class of my abstract class?

考虑以下 Java 计划:

abstract class Surprising
{       
    void fun()
    {
        System.out.println("fun() is invoked");
    }
}
class myclass
{
    public static void main(String args[])      
    {
        Surprising s=new Surprising() { };
        s.fun();
    }
}

这里我正在创建我的抽象的无名子对象class class 令人惊讶的是,不是抽象的对象 class 因为它不允许创建抽象的对象 class 在 Java 中。

等效的 C++ 程序是什么?是否可以在 C++ 中执行此操作?如果是,怎么办?如果不是,为什么不允许?

假设我们有 class A:

class A
{
    ...
};

现在要创建它的衍生物,我们使用例如

class B : public A
{
    ...
};

现在要创建一个匿名对象 class 我们只是不提供 class 名称:

class
{
    ...
} anon_object;

最后我们结合继承和匿名这两种方式classes:

class : public A
{
    ...
} anon_a_derived_object;

在将 class 声明为 new 表达式的一部分的意义上,您不能像在 Java 中那样即时执行此操作。但是你可以在函数内部创建一个本地class并使用它:

void main(int argc, char **argv)
{
  class MySurprising : public Surprising {};
  MySurprising s;
}

在 C++ 中,Surprising class 不会是 抽象的 ,因为它定义了它的所有成员。如果您想要一个 abstract(即不可实例化)class,请至少将其中一个成员设为纯虚拟。喜欢这里:

class Surprising
{
public:
    virtual void fun()=0;
};

然后您可以在创建实例的匿名 class 中定义成员,然后在该实例上调用新定义的成员函数:

#include <iostream>

int main()
{
    class  : public Surprising
    {
    public:
        virtual void fun() { std::cout << "Surprise!" << std::endl; }
    } inst_;
    inst_.fun();

    return 0;
}

与此问题相关的 Java 和 C++ 之间存在一些差异。我尝试生成与所讨论的 Java 代码最匹配的 C++ 代码。

#include <iostream>

class Surprising           // class is abstract since it has pure virtual method
{
public:
  virtual void fun() = 0;  // pure virtual method makes the class abstract
};

// we can define the pure virtual method, but not in class
inline void Surprising::fun()
{
  std::cout<<"fun() is invoked\n";
}

int main()
{
  struct : Surprising      // anonymous derived class
  {
    void fun()             // we must provide an implementation of fun()
    {                      // for otherwise this class remains abstract and
      Surprising::fun();   // cannot be instantinated
    }
  } s;                     // object of anyonmous class
  s.fun();
}