在Java中,您可以初始化一个抽象类,而无需通过实现抽象方法来获得从中派生的类。例如:
public abstract class A { public abstract void a(); }
public class Test {
public static void main(String[] args) {
A b = new A() { @Override public void a() { System.out.println("Test"); } }
}
}
我的问题是:你能用C ++做类似的事吗?
答案 0 :(得分:2)
C ++不支持此功能。
但是C ++通常使用较少的OOP(" OOP"在"使用虚函数"意义上)。特别是,从C ++ 11开始, lambdas 为Java中许多基于OOP的模式提供了强大的替代方案。
这是一个非常简单的例子:
#include <functional>
#include <iostream>
void f(std::function<void()> a)
{
a();
}
int main()
{
f([]() { std::cout << "Test\n"; });
}
或者:
#include <iostream>
template <class Operation>
void f(Operation operation)
{
operation();
}
int main()
{
f([]() { std::cout << "Test\n"; });
}
事实上,lambdas在编程方面已经变得如此受欢迎,以至于Java 8也支持它们:
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
答案 1 :(得分:2)
Java不允许在不从中派生非抽象类的情况下实例化抽象类。它只允许您直接在实例化时派生类“内联”,这被称为匿名类。
您可以在C ++中实现类似的效果。
#include <iostream>
struct ABC
{
virtual void f() = 0;
virtual ~ABC() {}
};
int
main()
{
struct : ABC { void f() override { std::cout << "okay\n"; } } anon {};
anon.f();
}
答案 2 :(得分:1)
答案是否定的。 您正在谈论的Java功能称为“匿名类”,这种功能在C ++中根本不存在。