gpt4 book ai didi

c++ - 在引用上跳过的重载函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:34 25 4
gpt4 key购买 nike

下面的代码尝试使用引用来引用基本组件类 Paragraph

#include <string>
#include <iostream>

using std::cout; using std::endl; using std::string;

// component
class Paragraph{
public:
Paragraph(const string& text = "") : text_(text) {}
virtual string getHTML() const { return text_; }
private:
const string text_;
};

// first decorator
class BoldParagraph : public Paragraph {
public:
BoldParagraph(const Paragraph& wrapped): wrapped_(wrapped) {}
string getHTML() const override {
return "<b>" + wrapped_.getHTML() + "</b>";
}
private:
const Paragraph &wrapped_;
};


// second decorator
class ItalicParagraph : public Paragraph {
public:
ItalicParagraph(const Paragraph& wrapped): wrapped_(wrapped) {}
string getHTML() const override {
return "<i>" + wrapped_.getHTML() + "</i>";
}
private:
const Paragraph &wrapped_;
};

int main(){
Paragraph p("Hello, World!");

BoldParagraph bp(p); cout << bp.getHTML() << endl;
BoldParagraph bbp(bp); cout << bbp.getHTML() << endl;
ItalicParagraph ibp(bp); cout << ibp.getHTML() << endl;
}

运行时产生

<b>Hello, World!</b>
<b>Hello, World!</b>
<i><b>Hello, World!</b></i>

而不是

<b>Hello, World!</b>
<b><b>Hello, World!</b></b>
<i><b>Hello, World!</b></i>

也就是说,如果第二个包装函数 getHML() 是针对对象 bbp 的同一子类 BoldParagraph,则它似乎被跳过了,但如果它用于对象 ibp 的不同子类 ItalicParagraphBoldParagraph 则不是。使用指针而不是引用的类似代码按预期工作。

这是为什么?

最佳答案

原因是 bbp(bp)bp 是类型 BoldParagraph 调用(隐式定义的)复制构造函数 BoldParagraph::BoldParagraph(const BoldParagraph &)然后执行成员明智的复制/分配,这样 wrapper_ 被切片,然后将成为 Paragraph & 类型比 BoldParagraph &。为了克服这个问题,您必须为 BoldParagraph::BoldParagraph(const BoldParagraph &) 提供一个显式复制构造函数,然后调用您自己的复制构造函数:

 BoldParagraph(const BoldParagraph& wrapped) : BoldParagraph((Paragraph&)wrapped) {} ;

关于c++ - 在引用上跳过的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420473/

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