C++:通过调用纯虚拟函数来避免重复

C++: Avoiding repetition by calling pure virtual function

本文关键字:函数 虚拟 调用 C++      更新时间:2023-10-16

对于以下代码,

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()的上下文相同),或者我们不能仅仅因为不能在构造函数中调用纯虚拟函数而避免它?

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

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

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