我有以下类的层次结构
class classOne
{
virtual void abstractMethod() = 0;
};
class classTwo : public classOne
{
};
class classThree : public classTwo
{
};
所有classOne,classTwo和classThree都是抽象类,我有另一个定义纯虚方法的类
class classNonAbstract : public classThree
{
void abstractMethod();
// Couple of new methods
void doIt();
void doItToo();
};
现在我需要不同的......我需要它像
class classNonAbstractOne : public classOne
{
void abstractMethod();
// Couple of new methods
void doIt();
void doItToo();
};
class classNonAbstractTwo : public classTwo
{
void abstractMethod();
// Couple of new methods
void doIt();
void doItToo();
};
和
class classNonAbstractThree : public classThree
{
void abstractMethod();
// Couple of new methods
void doIt();
void doItToo();
};
但是所有的非抽象类都有相同的新方法,使用相同的代码......我希望避免将所有方法及其代码复制到每个非抽象类中。我怎么能做到这一点?
希望这是可以理解的......
答案 0 :(得分:4)
template<class Base>
struct Concrete : Base {
void abstractMethod();
void doIt() {
// example of accessing inherited members:
int n = Base::data_member; // or this->data_member
n = Base::method(); // non-virtual dispatch
n = this->method(); // virtual dispatch
// since Base is a template parameter, 'data_member' and 'method' are
// dependent names and using them unqualified will not properly find
// them
}
void doItToo();
};
typedef Concrete<classOne> classNonAbstractOne; // if desired, for convenience
确保为您的抽象基类提供虚拟公共析构函数或使析构函数受到保护(然后它不必是虚拟的,但仍然可以)。
因为必须使用查找的名称解析模板而不确切知道 Base 将是什么,所以您需要使用Base::member
或this->member
来访问继承的成员。
答案 1 :(得分:1)
我通常尽可能避免继承(除了定义纯接口的纯抽象类),因为它会创建紧耦合。在许多情况下,成分是更好的选择。
此外,复杂的继承结构会使事情变得混乱。从你的描述中说出在这种特殊情况下最好的是什么并不容易。只是指出这是一条经验法则。