c – 如何防止调用基础实现方法

前端之家收集整理的这篇文章主要介绍了c – 如何防止调用基础实现方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们说我们有以下层次结构:
class Abstract
{
public:
    virtual void foo() = 0;
};

class Base : public Abstract
{
public:
    virtual void foo() override; //provides base implementation
};

class Derived : public Base
{
public:
    virtual void foo() override; //provides derived implementation
};

如果在Derived对象上调用了Base :: foo(),该对象将不会同步,并且其数据将被破坏.它继承了Base的数据结构及其操作,但需要执行其他操作,因此只调用Base :: foo()将省略这些额外的操作,从而导致Derived的状态将被破坏.

所以我想阻止直接调用Base的foo执行,所以这样:

Derived d;
d.Base::foo();

理想情况下,应该给我一些编译时间的错误.或者什么也不做,否则被阻止.

但是可能是我违反了多态规则,应该使用组合,但这需要大量的额外的打字…

解决方法

template method pattern怎么样
class Abstract
{
public:
    void foo() { foo_impl(); }
private:
    virtual void foo_impl() = 0;
};

class Base : public Abstract
{
private:
    virtual void foo_impl() override; //provides base implementation
};

class Derived : public Base
{
private:
    virtual void foo_impl() override; //provides derived implementation
};

然后

void test(Abstract& obj) {
    obj.foo();  // the correct foo_impl() will be invoked
}
Derived d;
test(d);  // impossible to call the foo_impl() of Base
原文链接:https://www.f2er.com/c/115168.html

猜你在找的C&C++相关文章