C ++中的抽象类初始化

时间:2015-07-19 12:17:12

标签: c++

在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 ++做类似的事吗?

3 个答案:

答案 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 ++中根本不存在。