virtual constructs

Posted zeqi1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了virtual constructs相关的知识,希望对你有一定的参考价值。

假定一个新闻由文字和图片组成

//抽象基类
class NLComponent
{

}

class TextBlock : public NLComponent
{}

class Graphic : public NLComponent
{}

//新闻管理器

class NewsLetter
{
public:

private:
    std::vector<NLComponent*> components;
}

问题 : NewsLetter要有拷贝构造函数时应该怎么处理?

对components这个成员变量复制一份(深拷贝),由于vector内部都是基类指针,我们需要知道它具体的类型是文字还是图片才能决定拷贝的是什么、这里就出现了问题。怎么解决?

//抽象基类
class NLComponent
{
public:
    virtual NLComponent* Clone() const = 0;
}

class TextBlock : public NLComponent
{
public:
    virtual TextBlock* Clone() const
    {
        return new TextBlock(*this);
    }
}

class Graphic : public NLComponent
{
public:
    virtual Graphic* Clone() const
    {
        return new Graphic(*this);
    }
}

//新闻管理器

class NewsLetter
{
public:
    NewsLetter(const NewsLetter& other)
    {
        for (size_t i = 0; i < other.components.size(); i++)
        {
            components.push_back(other.components[i].Clone());
        }
    }
private:
    std::vector<NLComponent*> components;
}

注意:在继承NLComponentClone函数时,虽然返回值发生了变化,但仍属于同一个虚函数

以上是关于virtual constructs的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.database.sqlite异常(代码片段

var ball0=new Ball("executing") 是怎样被执行的?

(继承)virtual与访问控制

[React] Create a Virtualized List with Auto Sizing Cells using react-virtualized and CellMeasurer(代码

代码大全2 chapter1 Welcome to Software Construction

Zend Framework 2:传递给Album Controller AlbumController :: __ construct()的参数1必须是Album Controller (代码