我有一个幼稚的C ++继承类问题。我有一个基类Base
,两个派生类DerivedA
和DerivedB
以及另外两个截然不同的类A
和B
,它们共享某些方法的名称。
理想情况下,我想在基类中设计使用A
和B
方法的方法。我的尝试是以下
#include <cstdio>
class A{
public :
A(){};
void speak(){printf("hello A\n");};
};
class B{
public :
B(){};
void speak(){printf("hello B\n");};
};
class Base{
public:
Base(){};
void method(){property.speak();}
A property;
};
class DerivedA : public Base{
public:
using Base::Base;
A property;
};
class DerivedB : public Base{
public:
using Base::Base;
B property;
};
int main(int argc, char *argv[]){
DerivedA da;
DerivedB db;
da.property.speak();
db.property.speak();
// Attempting to call the shared method on the two distinct properties
da.method();
db.method();
}
您能指出我一个更好的设计吗?我怀疑应该使用模板,但不确定如何使用。
答案 0 :(得分:1)
有几种方法各有优缺点。
template<class Property>
class Base{
public:
Base(){};
void method(){property.speak();}
Property property;
};
class DerivedA : public Base<A>{
};
class DerivedB : public Base<B>{
};
简单明了,但请注意,在这种情况下,DerivedA
和DerivedB
没有通用的基类,因此您不能,例如将指向它们的指针放在同一容器中。
class Base{
public:
virtual ~Base() {}
virtual void method() = 0;
};
class DerivedA : public Base{
public:
A property;
void method() override { property.speak(); }
};
class DerivedB : public Base{
public:
B property;
void method() override { property.speak(); }
};
这有点复杂,涉及一些代码重复并且需要更多资源(例如,用于存储虚拟表),但是现在这些类确实有一个共同的祖先。
class Base{
public:
virtual ~Base() {}
virtual void method() = 0;
};
template<class Property>
class Derived: public Base {
public:
Property property;
void method() override { property.speak(); }
};
using DerivedA = Derived<A>;
using DerivedB = Derived<B>;
这实际上是选项2,但没有代码重复:我们让编译器使用模板为我们生成代码。