какой из них является лучшим способом доступа к функциям-членам в производном классе базового класса? - PullRequest
0 голосов
/ 21 ноября 2018

Это единственный способ получить доступ к функции-члену базового класса с помощью оператора разрешения области.Но функции-члены имеют одинаковые имена 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();

}

См. Этот 2-й код, две разные функции в базовом и производном классах 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();

}

Какой из подходов является хорошим, который дает реальные преимущества наследования?мы должны использовать одинаковые именованные функции-члены в обоих классах (базовый и производный класс)?или мы должны использовать разные именованные функции-члены в обоих классах (базовый и производный).

И я знаю, что необходимо использовать функцию-член базы и функцию-член производного класса, потому что в соответствии с наследованием, производный класс также содержит все характеристики базового класса, поэтому он также будет содержать функцию-член базового класса.

Ответы [ 4 ]

0 голосов
/ 21 ноября 2018

Я поддерживаю простое правило, которое Титус Винтерс представил на CppCon 2018: «Имя работает одинаково, когда они делают одно и то же, поэтому звонящему не нужно знать, в чем разница».

Ваш первый код нарушает этот принцип:

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

Это потому, что showData() не является виртуальным.Это можно исправить лично, написав: virtual void showdata().

Поскольку похоже, что вы действительно намерены сделать то же самое для обоих классов, я бы предпочел это, а не ваши 2 предложения.

0 голосов
/ 21 ноября 2018

В этом примере ничего особенного нет, метод showdata в базовом классе person является общедоступным, и класс men тоже наследует public, поскольку men - это человек, мужчины могут вызывать showdata напрямую., не нужно делать что-то вроде person::showdata

0 голосов
/ 21 ноября 2018

Я бы предпочел сделать так:

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();
    }
};

Далее это позволит использовать преимущества полиморфизма.

0 голосов
/ 21 ноября 2018

Я предпочитаю использовать разные имена для базовых и производных классов, так как в некоторых языках программирования он может не принимать имя функции базового класса без ключевого слова override.

Лучше использовать разные имена и держать нас от конфликтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...