这是在范围解析运算符的帮助下访问基类的成员函数的一种方法。但是成员函数具有相同的名称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)中都使用不同名称的成员函数。
我知道有必要使用基类成员函数和派生类成员函数,因为根据继承,派生类也具有基类的所有特征,因此它也将保留基类的成员函数。
答案 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()
。
由于您似乎确实打算对这两个课程都做同样的事情,因此,与您的两个建议相比,我更愿意这样做。