不带指针的继承

Inheritance without pointers

本文关键字:继承 指针      更新时间:2023-10-16

假设我有一个类,它有一个抽象的虚拟函数,如下所示:

class MyClass{
  public:
    virtual void MyFunc() = 0;
};

我没有其他功能,也没有数据成员。我还可以保证,从中继承的所有类都没有任何数据成员,除了MyFunc的实现之外,没有其他函数。

强迫你有一个指向抽象对象的指针的最大原因(至少在我看来)是实现的大小未知。。。。那么,有没有一种方法可以代替指针指向这个类,只给出该类的一个实例(或伪实例)。举个例子:

void AFunction(MyFunc inst){  //Note the lack of pointer
  inst.MyFunc();  //This should call the implementation
}

那么,这可能吗?还是我只是一个一厢情愿的思想者?

必须传递指针或引用。您不能按值传递,因为根据定义,这涉及到制作值的副本;而且,根据定义,您不能复制抽象类的实例。C++不能以这种方式工作。

所以,任你选择:

void AFunction(MyFunc *inst){
  inst->MyFunc();
}

void AFunction(MyFunc &inst){
  inst.MyFunc();
}

这些是你的选择。除了虚拟方法实现之外,子类是否还有其他东西,或者抽象类是否除了虚拟方法之外还有其他东西都无关紧要。答案不会改变。

这是不可能的(没有引用或指针)

class Interface {
  public:
    virtual void F() = 0;
};
class Implementation: public Interface {
  public:
    void F() {}
};
void SomeFunction(Interface x) {}
int main() {
  Implementation impl;
  SomeFunction(impl);
}

这基本上就是你的建议。如果你要编译这个:

blah.cc:11:29: error: parameter type 'Interface' is an abstract class
void SomeFunction(Interface x) {}
                            ^

您可以使用引用,但这基本上只是具有不同语法的指针。

void SomeFunction(Interface & x) {}
int main() {
  Implementation impl;
  SomeFunction(impl);
}

您可以使用std::function。您可以通过不带指针的值传递它,但它的作用就像一个函数的接口:

void AFunction(std::function<void()> myfunc){
    myfunc();  //This will call the implementation
}

您可以使用lambda:创建这个"接口"

MyClass mc;
auto myfunc = [mc]{mc.MyFunc();};
AFunction(myfunc);

在内部,std::function使用类型擦除。

您可以创建自己的可以通过值传递的包装器,但可能需要在内部使用某种指针。