有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
Are there any way to make implementation for abstract class which is multiple inheriting from other abstract classes in c++?
我有两个'接口'类:AbstractAccess
和AbstractPrint
,AbstractRun
类继承自它们并使用它们的方法。 此外,我有两个接口实现:用于AbstractAccess
的访问器和用于AbstractPrint
的打印
#include <iostream>
using namespace std;
class AbstractAccess {
public:
virtual string access (void) = 0;
};
class AbstractPrint {
public:
virtual void print (string) = 0;
};
class AbstractRun : virtual public AbstractAccess, virtual public AbstractPrint {
public:
void run (void) {
print(access());
}
};
class Accessor : virtual public AbstractAccess {
public:
string access (void){
return name;
}
void setName(string name) {
this->name = name;
}
private:
string name;
};
class Print: public virtual AbstractPrint {
public:
void print (string s) {
cout << s << endl;
}
};
有没有办法将接口AbstractRun
强制转换为它们的实现,或者创建仅使用 AbstractRun 的"run"方法但使用已实现接口的实现类 Run?
虽然你的问题已经解决了,但我进一步研究了这个问题,我想纠正一些关于继承的困惑。
当您是一个类与另一个类具有"是"关系时,将使用继承。派生类应替代要从中继承的类。
在您的情况下,您可以放心地说class Print
是class AbstractPrint
,class Access
同样是class AbstractPrint
,因此继承在这里很好。
另一方面,class AbstractRun
不是AbstractPrint
也不是AbstractAccess
。AbstractRun
简单地处理/组合AbstractPrint
和AbstractAccess
。这种关系应该通过聚合(或组合)来抽象,因为AbstractRun
具有指向AbstractRun
和AbstractPrint
的引用/指针。这将使AbstractRun
具体,因此让我们将其重命名为Runner
.
class Runner
{
public:
// We now need a constructor to set the references.
Runner(AbstractAccess& access, AbstractPrint& print) :
accessor(access), printer(print) {}
void run (void) {
printer.print(accessor.access());
}
private:
AbstractAccess& accessor; // has a AbstractAccess
AbstractPrint& printer; // has a AbstractPrint
};
现在Access
和Print
可以像以前一样定义。
但是,让我们也改进这些:
class Print: public virtual AbstractPrint {
public:
void print (string s) {
cout << s << endl;
}
};
我们不需要虚拟继承。虚拟继承用于解决钻石问题。但是,除了AbstractRunner被做成一个具体的类之外,已经没有钻石了。因此,让我们删除不必要的限定符。
class Accessor : public AbstractAccess {
public:
string access (void){
return name;
}
void setName(string name) {
this->name = name;
}
private:
string name;
};
class Print: public AbstractPrint {
public:
void print (string s) {
cout << s << endl;
}
};
此外,如果你有一个兼容 C++11 的编译器,我建议你为覆盖基函数的方法添加override
限定符,以便能够确定从基类和非基类中获取的方法。
class Accessor : public AbstractAccess {
public:
string access (void) override { //overrides AbstractAcces method
return name;
}
void setName(string name) { //does not override. is a method at Accessor level
this->name = name;
}
private:
string name;
};
现在初始化一个Runner
,我们需要传递具体的访问器和打印机。这可以通过以下方式完成:
// Somewhere in a .cpp - file
Accessor accessor;
Print printer;
Runner runner(accessor, printe);
runner.run(); //will call printer and accessor through the references.
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- 访问其他抽象类,而无需在C 中包含参考
- 有没有办法实现从 c++ 中其他抽象类多重继承的抽象类?
- 使用其他类中抽象类的构造函数
- c'tor 和 d'tor 从抽象基础通过其他抽象类继承到具体
- 抽象类是否可以作为构成关系成为其他具体类的成员?c++
- 实例在其他地方实现的抽象类
- 抽象类方法用其他基类的子类实现