在 C++ 中的派生类之间共享公共代码
Posted
技术标签:
【中文标题】在 C++ 中的派生类之间共享公共代码【英文标题】:Sharing common code between derived classes in C++ 【发布时间】:2020-11-30 14:56:40 【问题描述】:在下面的示例中尝试在派生类之间共享公共代码时遇到问题:
class BaseWrite
public:
virtual void setup()
;
class Write : public BaseWrite
public:
void show()
cout << "Show Write" << endl;
virtual void print()
cout << "print Write" << endl;
;
class CompWrite : public Write
public:
void compFunc()
cout << "compFunc details" << endl;
;
//These below "Special" classes are in a separate file and are conditionally included while building the project
class SpecialWrite : public Write
public:
void setup() override
cout << "print SpecialWrite setup()" << endl;
;
class SpecialCompWrite : public CompWrite
public:
//any common functions
;
在上面的示例中,CompWrite
(或SpecialCompWrite
)对象应该能够访问Write
类的所有功能,以及在SpecialWrite
类中被覆盖的setup()
实现。
限制是,我无法将 setup
函数从 SpecialWrite
类提升到 Write
类或 BaseWrite
类。如果它有助于上下文,“Special*”类位于单独的文件中,并在构建项目时有条件地包含在内。
一种方法是我可以简单地覆盖SpecialCompWrite
类中的setup
函数,并从SpecialWrite
类复制代码。但我试图避免这种情况。
【问题讨论】:
I cannot move up the setup function from SpecialWrite class to the Write class or BaseWrite class.
为什么?
【参考方案1】:
如果CompWrite
可以访问SpecialWrite
中的所有公共函数,那么多重继承可以解决问题,但是两个类都继承自Write
,因此必须将继承更改为虚拟,CompWrite
类看起来喜欢:
class CompWrite : public Write, public SpecialWrite
如果setup()
函数是唯一需要访问的函数,那么SpecialWrite
和CompWrite
继承的新类可能会解决它。
class SetupWrite : public Write
public:
void setup() override
cout << "print SpecialWrite setup()" << endl;
;
...
class CompWrite : public SetupWrite
public:
void compFunc()
cout << "compFunc details" << endl;
;
...
class SpecialWrite : public SetupWrite
public:
// Other functions
;
【讨论】:
以上是关于在 C++ 中的派生类之间共享公共代码的主要内容,如果未能解决你的问题,请参考以下文章
Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?
C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???