抽象类-C++接口交换

abstract class - C++ Interfaces Exchanging

本文关键字:交换 接口 -C++ 抽象类      更新时间:2023-10-16

我试图通过创建只有纯虚拟方法的类来处理类似C++java/C#的接口,如下所示:(这只是一个例子)

class IMyInterface
{
public:
    virtual int someFunc() = 0;
    virtual ~IMyInterface() {}
};

一切都很好,直到我一直在实现一个交换IMyInterface数组中两个元素的方法,因为C++中不允许实例化接口,因为编译器会抱怨temp没有实现someFunc()

void Exchange(IMyInterface* array, int i, int j)
{
    IMyInterface temp = array[i]; // not allowed
    array[i] = array[j];
    array[j] = temp;
}

所以我不得不改变接口类的定义,去掉纯虚拟函数,并提供一个"默认"的方法实现,比如

class IMyInterface
{
public:
    virtual int someFunc()
    {
        return 0;
    }
    virtual ~IMyInterface() {}
};

问题是IMyInterface不再是一个接口,它不会强制从它继承的任何类实现someFunc()

不管怎么说?

接口不是完全定义的对象,因此无法创建它们的实例。它们具有未定义的大小和结构,因此显然无法在值上下文中创建或使用。但是,您可以创建指向接口的指针(Happy Guys?),因为指向对象的指针定义得很好。示例代码可能变成:

void Exchange(IMyInterface** array, int i, int j)
{
    IMyInterface* temp = array[i]; // allowed :)
    array[i] = array[j];
    array[j] = temp;
}

如果操作应该通过值来完成,那么模板函数可能更合适。