c++中的抽象类初始化

Abstract Class Initialization in C++

本文关键字:初始化 抽象类 c++      更新时间:2023-10-16

在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++中做这样的事情吗?

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 << "Testn"; });
}

或:

#include <iostream>
template <class Operation>
void f(Operation operation)
{
    operation();
}
int main()
{
    f([]() { std::cout << "Testn"; });
}

事实上,这些天lambdas在编程中非常流行,Java 8也支持它们:

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

Java不允许实例化抽象类而不从中派生非抽象类。它只允许您直接在实例化点派生"inline"类,这被称为匿名类

您可以在c++中实现类似的效果。

#include <iostream>
struct ABC
{
  virtual void f() = 0;
  virtual ~ABC() {}
};
int
main()
{
  struct : ABC { void f() override { std::cout << "okayn"; } } anon {};
  anon.f();
}

答案是否定的。你所说的Java特性叫做"匿名类",而这种特性在c++中根本不存在。