如何创建我的抽象类的无名派生类的对象?

时间:2015-09-03 08:43:34

标签: java c++ inheritance abstract-class pure-virtual

考虑遵循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();
    }
}

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

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

4 个答案:

答案 0 :(得分:6)

假设我们有班级A

class A
{
    ...
};

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

class B : public A
{
    ...
};

现在要创建一个匿名类的对象,我们根本就不提供类名:

class
{
    ...
} anon_object;

最后我们将两种方式结合起来,即继承和匿名类:

class : public A
{
    ...
} anon_a_derived_object;

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

Surprising

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

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

答案 3 :(得分: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();
}