gpt4 book ai didi

c++ - 为具有多重继承的一种类型设置默认构造函数

转载 作者:行者123 更新时间:2023-11-27 23:59:54 26 4
gpt4 key购买 nike

我有两个类(class),BaseDerived . 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(); .因此我试图继承 Derived也来自 Printer<Derived> .

class Derived : public Base, public Printer<Derived> {
public:
typedef Printer<Derived> MyPrinter;

using Base::Base;

Derived() : MyPrinter(*this) {}
};

现在我有一个问题:Base构造函数对 Printer 一无所知因此无法以任何方式初始化它。我也不能在这里使用构造函数委托(delegate),因为 Derived 中使用的构造函数实际上是继承自Base .

我能以某种方式创建 Derived 的默认构造函数吗?被任何其他构造函数委托(delegate),甚至是继承的构造函数?或者,也许还有其他一些模式可以在多重继承中初始化第二个基数?

还有一件事使一切变得更加困难,那就是我无法访问 Base。的代码,只能按原样使用。

更新关于 Remy Lebeau 的回答:Base可以有多个我不知道的构造函数(它也是一个模板类),所以我不能实现所有的构造函数,必须使用 using Base::Base成语。

关于 krzaq 的回答:Printer其实还有很多方法,不止print() , 所以实现转发器类是一件麻烦事,我尽量避免它。

最佳答案

如果您只需要访问 Derived来自 Printer<Derived> 的实例然后你可以简单地把它扔下来:

template<typename T>
class Printer {
public:
const T& object;

Printer() : object(static_cast<T&>(*this)) {}

void print() {
cout << object << endl;
}
};

live demo

或者完全取消引用,让你的类(class)有资格获得 EBO :

template<typename T>
class Printer {
public:
void print() {
cout << static_cast<T&>(*this) << endl;
}
};

live demo

如果你不能/不想碰Printer或者,我会创建一个单独的模板 PrinterForwarder转向print()调用正确的打印机:

template<typename T>
class PrinterForwarder
{
public:
void print() {
Printer<T>(static_cast<T&>(*this)).print();
}
};

class Derived : public Base, public PrinterForwarder<Derived> {
public:
using Base::Base;
};

live demo

关于c++ - 为具有多重继承的一种类型设置默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39987019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com