【发布时间】:2013-11-22 09:15:00
【问题描述】:
请考虑这个类层次结构:
#include <iostream>
struct Base
{
Base(int arg1, int arg2, int arg3, int arg4)
{
std::cout << "Base::Base:" << arg1 << "," << arg2 << "," << arg3 << "," << arg4 << std::endl;
}
void BaseDoWork()
{
std::cout << "Base::BaseDoWork" << std::endl;
}
};
struct Derived1:public Base
{
Derived1(int arg1, int arg2, int arg3, int arg4):Base(arg1, arg2, arg3, arg4){}
void DerivedDoWork()
{
BaseDoWork();
}
};
struct Derived2:public Derived1
{
Derived2(int arg1, int arg2, int arg3, int arg4):Derived1(arg1, arg2, arg3, arg4){}
};
int main(int argc, char *argv[])
{
Derived2 myDerived2(1,2,3,4);
myDerived2.DerivedDoWork();
return 0;
}
Derived1 类的耦合比我想的要多:它必须知道如何构造“Base”类。在较深的层次结构中,这意味着将“基”类构造函数的参数一直沿类层次结构向下传播。更改“基”类构造函数需要更改所有派生类。
我对这个类层次结构的目标是:
Derived1 需要基类中的 BaseDoWork() 方法,但不需要知道如何构造基类。
Derived2 知道如何构造“Base”类。
理想情况下,我想让 Derived1 成为接受任何具有可访问“BaseDoWork()”方法的基类的模板,如下所示:
template <T> struct Derived1:public T
{
void DerivedDoWork()
{
BaseDoWork();
}
};
但是,如果我将上述模板实例化为Derived1<Base>,如果不向 Derived1 添加“Base”构造函数参数的知识,我将看不到如何构造“Base”类。
【问题讨论】: