gpt4 book ai didi

C++:通过 'extending?' 基实例/实现向下转换创建派生实例?

转载 作者:太空狗 更新时间:2023-10-29 20:55:03 26 4
gpt4 key购买 nike

我有一个 C++ 类,它本质上是一个容器:

class SimpleContainer {
public:
// Various accessor methods / iterators
private:
// The actual content
}

除了SimpleContainer - 我想创建一个 StrictContainer延伸SimpleContainer通过在内容上执行规则来语义化,但使用与现有 SimpleContainer 相同的内容实例。

class StrictContainer : public SimpleContainer {

StrictContainer( const SimpleContainer& simple ) {
// Check content in simple, and raise an exception
// if it is not valid.
}
}

现在 - 我的问题是 SimpleContainer 之间应该有什么样的关系?和 StrictContainer :

是一个:看起来很自然;这就是我在继承中指出的内容,但随后我将创建一个 StrictContainer基于扩展的实例 SimpleContainer施工后实例 - 这可能吗?

有一个或者,我可以将其实现为 has-a 关系,其中 StrictContainer有一个 SimpleContainer成员,但随后我需要在 StrictContainer 中再次实现所有访问器和迭代器。并转发到 SimpleContainer实现。

容器相当大;我真的不会在创建 StrictContainer 时复制内容.我想我想要的是一种实现我自己的向下转换运算符的方法:

SimpleContainer simple;
// Fill simpleContainer

{
StrictContainer* strict = downcast<StrictContainer>( simple )
...
}

哪里downcast<StrictContainer>会在 StrictContainer 上调用一个方法验证 simple 的内容输入参数?

最佳答案

is-a 将是一场灾难。假设规则是 SimpleContainer 包含整数,而 StrictContainer 只包含奇数。

StrictContainer strict;
SimpleContainer simple;
strict.insert(1); // OK value is odd
simple.insert(2); // OK simple doesn't check oddness.
SimpleContainer& sc = strict; // Reference to base.
sc.SimpleContainer::insert(2); // Uh-oh. That will use the simple container version
// of insert (even in the presence of virtual functions)
// and will insert an invalid even number into `simple`.

你需要has-a

关于C++:通过 'extending?' 基实例/实现向下转换创建派生实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37096897/

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