与Java接口相比,C++中的接口和虚函数

uml*_*uml 4 c++ virtual-functions interface header

我有一个关于C++虚函数的问题.该virtual关键字用于class基类中的函数的C++ 声明中,以通知该函数的子类实现可能从子类到子类不同.不同的子类可以具有不同的函数实现.

我不明白.当你在C++中定义接口时,就我现在所看到的而言,它与Java中的接口不同.

实际上我不明白C++中的单词接口是什么意思.您可以virtual在头文件中指定一个函数.然后,基类的子类或派生类可以以任何方式覆盖它,只要它是虚函数即可.

C++中的接口是头文件吗?

干杯

Jac*_*ack 6

Java和C++之间的主要区别在于Java中的每个函数都是virtual.

从历史上看,当开发C++时,在每个函数调用之间放置一个abastraction层(即使用虚方法表发生的事情)并不是你想要的每个方法调用,因为虚拟方法调用较慢.

因此,必须指定必须通过动态绑定调用方法,否则根据变量的声明在编译期间选择方法.这意味着如果你声明Base *b = new Derived()并调用一个b非虚拟的方法,那么在编译时选择方法,它将是一个Base::method.

座右铭是你不为你不使用的东西付钱,就是这样.

C++中的接口不存在,但是你可以拥有一个只有纯虚函数的类,它的行为基本相同.实际上你可以有两种虚拟方法:

class Base {
  virtual void method() {
    //implementation
  }
  virtual void pureMethod() = 0;
}
Run Code Online (Sandbox Code Playgroud)

首先method()是虚拟并遵守动态绑定,但它甚至在Base类中实现,同时pureMethod()仍然遵循动态绑定,但它被声明为纯虚拟,因此它没有任何实现,因此Base无法实例化,您需要将其子类化并至少覆盖纯虚方法.


Ric*_*ers 6

Java中的接口是特定的语言构造或关键字.Java有一个关键字interface,用于表示Java类不提供实际的实现,而是描述派生类必须实现的接口.Java编译器会检查这一点,以确保声称实现接口的类为接口提供所有必需的方法.

在Java中,interface关键词表示类提供由指定的接口类描述的一组服务.Java类可以实现多个不同的接口.

单词界面在与C++讨论中使用的方式有点类似,因为它与类或函数或方法的参数类型有关.但是interfaceC++中没有关键字.单词interface用于C++的更通用的描述性方式,如"函数接口需要两个短路和一个长".它表示函数调用参数及其类型,函数调用者和函数体之间的接口.

因此,将C++中的接口视为实现接口的类与使用从类实例化的对象的任何对象之间的一种契约.一个类实际上也可以提供几个不同的相关服务,每个服务都有一个特定的接口.

interface通过在类描述中使用纯虚方法来创建抽象类,可以在C++中执行类似于Java 概念的操作.这将创建一个没有实现的C++类.请参阅C++:使用抽象方法创建抽象类并覆盖子类中的方法.

虚方法的作用是提供一种机制,以便使用类的派生类的对象可以依赖于特定接口,同时将实现的细节留给派生类.所以这类似于Java接口.C++虚方法是一种使用编译和静态检查方法而不是运行时方法来实现Java接口的方法.

使用虚方法,您可以创建一个超类类型,可用于创建可从派生类型中分配变量的指针变量,并且在使用虚方法时,将调用派生类中的正确方法.找出要在编译时完成调用的方法而不是运行时间.C++的主要思想是与C一样有效,同时在编译时提供面向对象的语言结构以及静态类型检查,以减少运行时对错误检测的依赖及其额外开销.

class Joe {
public:
virtual int thingOne() { return 1;}  // standard, not pure virtual method
..
};

class JoeTwo : public Joe {
public:
int thingOne() { return 2;}   // derived class provides its own version of the method
..
};

Joe *myJoe = new JoeTwo;

int i = myJoe->thingOne();  // value of 2 put into i and not value of 1
Run Code Online (Sandbox Code Playgroud)

使用C++,您需要识别对象和指向对象的指针之间的区别,因为对象切片可能在包含派生对象的变量分配给包含派生对象的超类的变量时发生.这种" 对象切片 "将发生,因为派生对象不适合从中派生它的基类或超类对象.派生对象有额外的东西,超类对象没有这样的赋值(默认赋值是直接内存拷贝)只有派生对象的超类部分被复制到超类对象中.

class Joe {
public:
virtual int thingOne() { return 1;}  // standard, not pure virtual method
..
};

class JoeTwo : public Joe {
public:
int thingOne() { return 2;}   // derived class provides its own version of the method
..
};

Joe *myJoe = new JoeTwo;    // no object slicing since this is pointer
JoeTwo myJoeTwo;
Joe  myJoeSliced = myJoeTwo;  // JoeTwo object myJoeTwo sliced to fit into Joe object myJoeSliced
Run Code Online (Sandbox Code Playgroud)


Ger*_*eon 5

C++ 没有像 Java 那样的接口。最接近的情况是定义一个仅具有纯虚函数的类,以便从该类派生的每个人都被迫实现所有这些函数。