【问题标题】:C++: Avoiding repetition by calling pure virtual functionC++:通过调用纯虚函数来避免重复
【发布时间】:2014-06-10 12:40:36
【问题描述】:

对于以下代码,

class A
{
    private:
        virtual void f() = 0;
        virtual void g() = 0;
        ...

    public:
        A()
        {
        }

        ...
}

class B : public A
{
    private:
        void f()
        {
            ...
        }
        void g()
        {
            ...
        }
        void h()
        {
            if (...)
            {
                f();
            }
            else
            {
                g();
            }
        }

        ...

    public:
        B()
        {
            h();
        }

        ...

}


class C : public A
{
    private:
        void f()
        {
            ...
        }
        void g()
        {
            f();
        }
        void h()
        {
            if (...)
            {
                f();
            }
            else
            {
                g();
            }
        }

        ...

    public:
        C()
        {
            h();
        }

        ...

}

有没有办法避免 h() 的重复(B 类和 C 类中函数 h() 的上下文是相同的)或者我们不能仅仅因为我们不能在构造函数中调用纯虚函数而避免它?

【问题讨论】:

  • 你真的想要private f 和 g?
  • 这是教科书中的一个例子,在我的问题中是否重要?
  • 这是一个非常模糊的问题,您的构造函数设置不太正确。此外,如果您创建一个私有纯虚函数,则它不能被实例化,也不能其任何子类。
  • @AhmedMasud:哦,是的,它可以。这也让我感到震惊。
  • 对你的问题:是的,这是virtual的主要用途之一。

标签: c++


【解决方案1】:

您可以将您的函数h() 实现为A 的成员。

只有在A::A()(或其他A 构造函数或A::~A())的主体期间执行h() 时,纯虚函数调用才会成为问题。在B::B()C::C() 的主体内,*this 的多态类型分别为BC,因此在BC 类中声明的虚拟覆盖将生效。

【讨论】:

    【解决方案2】:

    当然,添加一个中间类 D,它只实现该功能并从 A 继承。然后 B 和 C 可以从 D 继承。

    【讨论】:

    • 我在 B 和 C 的构造函数中调用它不会导致“纯虚函数调用”错误吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 2014-04-03
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多