C ++:在派生类成员上调用基类方法

时间:2019-11-15 17:11:36

标签: c++

我有一个幼稚的C ++继承类问题。我有一个基类Base,两个派生类DerivedADerivedB以及另外两个截然不同的类AB,它们共享某些方法的名称。

理想情况下,我想在基类中设计使用AB方法的方法。我的尝试是以下

#include <cstdio>
class A{
    public :
        A(){};
        void speak(){printf("hello A\n");};

};

class B{
    public :
        B(){};
        void speak(){printf("hello B\n");};
};


class Base{
    public:
        Base(){};
        void method(){property.speak();}
        A property;

};


class DerivedA : public Base{
    public:
        using Base::Base;

    A property;

};

class DerivedB : public Base{
    public:
        using Base::Base;

        B property;

};

int main(int argc, char *argv[]){


    DerivedA da;
    DerivedB db;

    da.property.speak();
    db.property.speak();

    // Attempting to call the shared method on the two distinct properties 
    da.method();
    db.method();
}

您能指出我一个更好的设计吗?我怀疑应该使用模板,但不确定如何使用。

1 个答案:

答案 0 :(得分:1)

有几种方法各有优缺点。

  1. 您可以像这样使基类成为模板:
template<class Property>
class Base{
    public:
        Base(){};
        void method(){property.speak();}
        Property property;

};


class DerivedA : public Base<A>{
};

class DerivedB : public Base<B>{
};

简单明了,但请注意,在这种情况下,DerivedADerivedB没有通用的基类,因此您不能,例如将指向它们的指针放在同一容器中。

  1. 您可以使用多态性。
class Base{
    public:
        virtual ~Base() {}
        virtual void method() = 0;

};

class DerivedA : public Base{
    public:
        A property;
        void method() override { property.speak(); }
};

class DerivedB : public Base{
    public:
        B property;
        void method() override { property.speak(); }
};

这有点复杂,涉及一些代码重复并且需要更多资源(例如,用于存储虚拟表),但是现在这些类确实有一个共同的祖先。

  1. 组合模板和多态性
class Base{
    public:
        virtual ~Base() {}
        virtual void method() = 0;

};

template<class Property>
class Derived: public Base {
    public:
        Property property;
        void method() override { property.speak(); }
};

using DerivedA = Derived<A>;
using DerivedB = Derived<B>;

这实际上是选项2,但没有代码重复:我们让编译器使用模板为我们生成代码。

  1. 其他选项。根据您的要求,可能还有其他更专业的选项。