2015-09-03 69 views
1

考虑以下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++中做到这一点?如果是,&如果不是,为什么不允许?

回答

3

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

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

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

#include <iostream> 

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

    return 0; 
} 
+1

这与问题中的例子有很大的不同。现在每个匿名者都必须实现'fun'方法。我会建议添加一个虚拟的方法,所以'惊讶'类仍然实现'fun' – Timo

+2

没有必要这样做,我只是这样做,因为我有这样的感觉,OP有一个特定的原因使'惊讶'抽象,即防止实例化。人们可以在'Surprising'中定义'fun()'函数,然后从中派生出一个类,但是如果派生类不添加或改变功能,那么子类是什么? –

+0

''最好让匿名类使用'override'关键字而不是'virtual'。 ''干杯 –

6

比方说我们有一流的A

class A 
{ 
    ... 
}; 

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

class B : public A 
{ 
    ... 
}; 

我们创建一个匿名类的一个对象,我们根本就没有提供一个类名:

class 
{ 
    ... 
} anon_object; 

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

class : public A 
{ 
    ... 
} anon_a_derived_object; 
3

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

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

更为相似的将是匿名'struct:Surprising {} s; s.fun();' – Walter

+0

@Walter这就是其他答案显示的内容。我会离开我的完整感。例如,这可以让您选择动态分配。 – Angew

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(); 
}