有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
Is there a way to pass by value all the sub-classes of an pure abstract class to a function in C++?
>假设我有 2 个类A
和B
,其中A
是一个具有纯虚函数的纯抽象类,B
继承自A
并实现纯虚函数。如果我有一个函数g()
我想将A
by value 的子类的任何实例传递给(这样我就可以在不更改原始实例的情况下改变它(,你会怎么做? 我知道以下代码不符合我的目的:
void g(A myObject) {} //doesn't work since A contains a pure virtual function
void g(A* myObject) {} //code compiles, but changes the original instance
我会复制实例并创建一个指向它的指针并传递给上面的函数吗?还是有更清洁的方法可以做到这一点?
我认为这里的最佳实践是利用clone()
方法:
#include <iostream>
#include <memory>
class Base
{
public:
virtual void set_str(std::string) = 0;
virtual void print() = 0;
virtual std::unique_ptr<Base> clone() = 0;
};
class Derived: public Base
{
private:
std::string _str;
public:
std::unique_ptr<Base> clone() override {
return std::make_unique<Derived>(*this);
}
void set_str(std::string str) override {
this->_str = str;
}
void print() override {
std::cout << this->_str << std::endl;
}
};
void foo(std::unique_ptr<Base> obj) {
obj->set_str("inside");
obj->print();
}
int main() {
Derived obj;
obj.set_str("outside");
foo(obj.clone());
obj.print();
return 0;
}
如果确实是 A 中的纯虚函数,是什么阻止了复制。如果 A 可以从其子类复制创建,则对原始对象进行切片,只保留 A 中的字段。
如果要防止修改,可以:
- 将纯虚函数替换为引发异常的函数。类 A 将变得可创建,而如果您尝试在非子类化对象上使用该函数,它仍然会中断。
- 使用上述定义的函数在层次结构中插入一个 A1 类,并在
g
中使用它
这两种方法都会创建原始对象的副本并传递该(切片(副本
您也可以使用常量引用:
void g(const A& myObject);
这将传递对原始对象的引用,但如果尝试修改它,编译器将引发错误。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类