c++中的抽象类初始化
Abstract Class Initialization in 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++中做这样的事情吗?
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.htmlJava不允许实例化抽象类而不从中派生非抽象类。它只允许您直接在实例化点派生"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++中根本不存在。
相关文章:
- C++初始化基类
- 为什么在C++中首先初始化成员类
- 初始化指向类实例的智能指针并访问其方法
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++17 使用驱动类常量作为基类构造函数的参数来初始化基类构造函数
- 初始化模板类中的固定长度数组
- 在 C++11 中轻松初始化模板类的静态成员,没有 clang 警告
- 如何从子类的构造函数初始化父类的私有成员
- C++构造函数如何初始化其类的对象?
- 如何使用其中一个具体类实例化抽象类?
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 如何从静态类函数初始化静态类对象
- 如何初始化对类内变量的静态引用,以便在嵌套类中使用
- OOP - 抽象类类型,初始化基类和派生类中的变量
- 如何从其抽象母类上的指针初始化子类?
- 我应该初始化抽象类的成员吗?
- C++:正确初始化抽象类的构造函数
- 使用纯虚拟方法在C 中初始化抽象类
- 在C++中初始化抽象基类的子类数组
- 初始化抽象类的虚基类