【问题标题】:Change Protected Method From Abstract Class to Private In Concrete Class在具体类中将受保护的方法从抽象类更改为私有
【发布时间】:2013-10-28 18:44:58
【问题描述】:

我想创建一个带有纯虚拟私有方法的抽象类,但我无法在我的具体类中实现它。我的选择是使纯虚拟私有方法受到保护,但在我的具体类中,我只想将其设为私有。喜欢,

class IFoo
{
public:
    IFoo(){}
    virtual ~IFoo(){}

protected:
    virtual void fooMethod() = 0;
};

class Foo : public IFoo
{
public:
    Foo(){}
    virtual ~Foo(){}

private:
    virtual void fooMethod() {}
};

这样做有什么暗示吗?还是这样就好了?

谢谢!

【问题讨论】:

  • 允许并且有效地覆盖私有虚函数。请参阅this
  • @HansPassant 怎么样? IFoo 的方法是受保护的,因此不能被客户端调用。
  • @HansPassant:不!因为它是纯的虚拟的所以不能被调用
  • @HansPassant: Wrong again :) 将此转换为IFoo* 并调用会给出错误:virtual void IFoo::fooMethod() 受保护。我还在Foo 的方法中尝试了IFoo::fooMethod,它给出了链接器错误。
  • @legends2k - 如果您为纯虚函数提供实现,则可以调用它们。唯一真正的要求是子类实现它们。例如,如果你想确保基类永远不会被实例化,你可以给它一个纯虚析构函数。即使你有析构函数的实现,它仍然是一个抽象类。事实上,析构函数必须有一个实现,但它可能是基类中唯一要保持抽象的函数。

标签: c++


【解决方案1】:

为什么不能在基类中将方法设为私有?将它们设为私有是 C++ 的一种非常标准的设计模式。然后基类实现调用私有方法的公共/受保护方法。

http://www.gotw.ca/publications/mill18.htm 有更多关于使用公共/私有/受保护的虚拟方法的信息。

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2017-06-14
    • 2017-11-28
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多