【发布时间】:2016-10-11 21:26:03
【问题描述】:
我有两个班级,Base 和 Derived。 Derived 继承了 Base 的所有构造函数。另外,我有一个模板类Printer<T>,它包含对T 类型对象的引用,并有一个方法print(),它以某种方式打印一个对象。这是一个最小的插图。
class Base {
public:
Base(int x) : x(x) {}
int x;
};
template<typename T>
class Printer {
public:
const T& object;
Printer(const T& object) : object(object) {}
void print() {
cout << object << endl;
}
};
class Derived : public Base {
public:
using Base::Base;
};
std::ostream& operator<<(std::ostream& out, const Derived& d) {
return out << d.x;
}
int main() {
Derived d(1);
Printer<Derived>(d).print();
}
现在我想避免直接使用Printer 并允许这样的语法:Derived d(1); d.print();。因此我尝试从Printer<Derived> 继承Derived。
class Derived : public Base, public Printer<Derived> {
public:
typedef Printer<Derived> MyPrinter;
using Base::Base;
Derived() : MyPrinter(*this) {}
};
现在我有一个问题:Base 构造函数对Printer 一无所知,因此无法以任何方式对其进行初始化。我也不能在这里使用构造函数委托,因为Derived 中使用的构造函数实际上是从Base 继承的。
我能否以某种方式使Derived 的默认构造函数由任何其他构造函数委托,甚至是继承的构造函数?或者也许还有其他一些模式来初始化多重继承中的第二个基?
还有一件事使一切变得更加困难,那就是我无法访问Base 的代码,只能按原样使用它。
更新
在 Remy Lebeau 的回答中:Base 可以有多个我不知道的构造函数(它也是一个模板类),所以我无法实现所有这些,必须使用 using Base::Base 成语。
关于 krzaq 的回答:Printer 其实也有很多方法,不仅仅是print(),所以实现转发器类是一件麻烦事,我尽量避免。
【问题讨论】:
-
您忘记了基类中的虚拟析构函数。
-
不。构造函数只能由同一类的另一个构造函数委托。这也与构造函数无关。即使可以以某种方式委托构造函数,但事实是
Base的接口是刻在石头上的。就是这样。如果,如您所说,您只能“按原样”使用Base,那么您唯一能做的就是覆盖Base中的任何虚拟方法。您不能向其中添加任何方法。结束。 -
@PaulMcKenzie 当然,真实代码中有一些,我只是在制作这个人工示例时忘记了一些。谢谢。
标签: c++ inheritance multiple-inheritance