不带指针的继承
Inheritance without pointers
假设我有一个类,它有一个抽象的虚拟函数,如下所示:
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
使用类型擦除。
您可以创建自己的可以通过值传递的包装器,但可能需要在内部使用某种指针。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- 共享指针继承,而不先显式强制转换
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 使用智能指针附加的继承对象的深层复制
- 嵌套类、继承和C++中的共享指针
- 删除C++中的继承类指针数组
- 具有虚拟指针和继承的 CPP 类大小
- 钻石继承虚拟成员铸造与指针
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- cppyy 继承包含智能指针的类
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 是否可以将成员作为指针继承
- C++继承从基类指针访问派生类中的非虚拟函数
- 使用继承的指针列表复制构造函数或重载运算符=
- 带有此指针的模板类多重继承构造函数不起作用?
- 两个不同的继承指针地址是如何相等的
- 多重继承指针比较
- 多个继承指针和强制转换
- c++继承指针