考虑遵循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 ++中执行此操作?如果是的话,&如果不是,为什么不允许?
答案 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();
}