在基类的派生类中访问成员函数的最佳方法是哪一种?

时间:2018-11-21 06:31:41

标签: c++ inheritance override member-functions

这是在范围解析运算符的帮助下访问基类的成员函数的一种方法。但是成员函数具有相同的名称display()。

#include<iostream>
using namespace std;
class person{
    public:
        int age;
        void display()  /////////// One member function same name
        {
            cout<<age;
        }
};
class men:public person
{
    public:
    int height;
    void display()   ///////// Other member function same name
    {
    cout<<height;
    person::display();
    }

};
main()
{
    men A;
    A.age=25;
    A.height=6;
    cout<<"results is"<<endl;
    A.display();

}

请参阅第二代码,这是基类和派生类display()和showdata()的两个不同函数。两者的工作原理与上述代码段相同。

#include<iostream>
using namespace std;
class person{
    public:
        int age;
        void showdata() ////////////// One member function
        {
            cout<<age;
        }
};
class men:public person
{
    public:
    int height;
    void display()   ////////// another member function
    {
    cout<<height;
    person::showdata();
    }

};
main()
{
    men A;
    A.age=25;
    A.height=6;
    cout<<"results is"<<endl;
    A.display();

}

哪种方法能给继承带来实际好处?我们是否应该在两个类(基类和派生类)中使用相同的命名成员函数?还是我们应该在两个类(Base和Derived)中都使用不同名称的成员函数。

我知道有必要使用基类成员函数和派生类成员函数,因为根据继承,派生类也具有基类的所有特征,因此它也将保留基类的成员函数。

4 个答案:

答案 0 :(得分:1)

我宁愿这样做:

class person
{
public:
    int age = 0;
    virtual ~person(){}
    virtual void display()
    {
        cout<<age;
    }
};

class men:public person
{
public:
    int height = 0;
    void display() override
    {
        cout<<height;
        person::display();
    }
};

进一步,它将允许使用多态性的优点。

答案 1 :(得分:0)

我更喜欢为基类和派生类使用不同的名称,因为在某些编程语言中,如果没有override关键字,它可能不接受基类函数的名称。

最好使用不同的名称,并使我们远离冲突。

答案 2 :(得分:0)

在此示例中没有太多工作,基类 person 中的方法showdata是公共的,而men类也公开继承了person,因为men是一个人,因此,男人可以直接致电showdata,无需执行person::showdata

答案 3 :(得分:0)

我赞成蒂特斯·温特斯(Titus Winters)在CppCon 2018上提出的一条简单规则:名称在执行相同的操作时具有相同的功能,因此调用者无需知道区别如何。

您的第一个代码违反了这一原则:

person &p = getMen();
p.showData();

这是因为showData()不是虚拟的。 可以通过以下方式亲自解决:virtual void showdata()

由于您似乎确实打算对这两个课程都做同样的事情,因此,与您的两个建议相比,我更愿意这样做。