如何创建我的摘要 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();
}
考虑以下 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();
}